`
zhaolei415
  • 浏览: 166339 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

工厂模式

阅读更多
工厂模式是一个系列,有简单工厂模式、工厂方法模式、抽象工厂模式。

简单工厂模式:
用《java与模式》中的例子说明:一个农场公司,专门向市场销售各类水果在这个系统里需要描述下列的水果:
葡萄 Grape
草莓 Strawberry
苹果 Apple
水果与其他的植物有很大的不同,就是水果最终是可以采摘食用的。那么一个自然的作法就是建立一个各种水果都适用的接口,以便与农场里的其他植物区分开我们的做法是用fruit做为水果的接口类。
Grape.java
public class Grape implements Fruit
{
    public void grow()
    {
    	System.out.println("Grape is growing...");
    }

    public void harvest()
    {
    	System.out.println("Grape has been harvested.");
    }

    public void plant()
    {
        System.out.println("Grape has been planted.");
    }

    public boolean getSeedless()
    {
        return seedless;
    }

    public void setSeedless(boolean seedless)
    {
        this.seedless = seedless;
    }

    private boolean seedless;
}

Strawberry.java

public class Strawberry implements Fruit
{
    
    public void grow()
    {
    	System.out.println("Strawberry is growing...");
    }

    public void harvest()
    {
    	System.out.println("Strawberry has been harvested.");
    }

    public void plant()
    {
        System.out.println("Strawberry has been planted.");
    }

}

Strawberry.java
public class Apple implements Fruit
{

    public void grow()
    {
    	System.out.println("Apple is growing...");
    }

    public void harvest()
    {
    	System.out.println("Apple has been harvested.");
    }

    public void plant()
    {
        System.out.println("Apple has been planted.");
    }

    public int getTreeAge(){ return treeAge; }

    public void setTreeAge(int treeAge){ this.treeAge = treeAge; }

    private int treeAge;
}

接口Fruit.java
public interface Fruit
{
    void grow();

    void harvest();

    void plant();
}

农场的园丁也是系统的一部分(FruitGardener.java)类会根据客户端的要求,创建出不同的水果对象。
FruitGardener.java

public class FruitGardener
{
    public static Fruit factory(String which) throws BadFruitException
    {
        if (which.equalsIgnoreCase("apple"))
        {
            return new Apple();
        }
        else if (which.equalsIgnoreCase("strawberry"))
        {
            return new Strawberry();
        }
        else if (which.equalsIgnoreCase("grape"))
        {
            return new Grape();
        }
        else
        {
         	throw new BadFruitException("Bad fruit request");
        }
    }
}

上面的代码流程就是一个简单工厂模式,其实就是通过工厂类(FruitGardener)中的一个静态方法决定生产哪种水果,因此简单工厂模式也叫做静态工厂方法模式。大家很明显的看到简单工厂模式的好处的不足之处:
好处:消费者(client)只管消费不管创建,责任分工明细了。
缺点:(1)将这么多的逻辑集中放在一个“上帝类”里面,什么时候上帝挂了,那就惨了,不好。
      (2)在这个系统中,功能的扩展体现在引进新的产品上。“开–闭”原则要求系统允许当新的产品加入系统中,而无需对现有代码进行修改。这一点对于产品的消费角色是成立的,而对于工厂角色是不成立的。
    对于工厂角色来说,增加新的产品是一个痛苦的过程。工厂角色必须知道每一种产品,
如何创建它们,以及何时向客户端提供它们。换言之,接纳新的产品意味着修改这个工厂
角色的源代码。
                                                     ----待续

说明:本文是我学习java与设计模式过程中的随笔并非本人独创,我只是做为知识内容的搬运工,而已。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics