工厂模式(head first中简单工厂和工厂模式的迷惑)

来源:互联网 发布:linux给用户授权目录 编辑:程序博客网 时间:2024/04/29 15:49

所有工厂模式都是为了封装对象的创建

1. 简单工厂


《head First设计模式》中简单工厂理解有错误。

    又称静态工厂模式。主要有静态工厂方法,抽象产品,具体产品三个角色。

public class SimplePizzaFactory {    public static Pizza createPizza(String type) {      if (type.equals("cheese")) {        return new NYCheesePizza();      } else if (type.equals("clam")) {        return new NYClamPizza();      } else {        return null;      }    }  }
   <pre name="code" class="java">public class PizzaStore {    public Pizza orderPizza(String type) {      Pizza pizza = null;      pizza = SimplePizzaStory.createPizza(type);      pizza.prepare();      pizza.bake();      pizza.cut();      pizza.box();      return Pizza;    }  }

如果要增加工厂种类,则需要改动简单工厂。违反了开闭原则。

2. 工厂方法

工厂方法模式将简单工厂中的工厂方法则不再是静态方法。head first中的工厂方法模式即

public class NYPizzaStore {    public Pizza createPizza(String type) {      if (type.equals("cheese")) {        return new NYCheesePizza();      } else if (type.equals("clam")) {        return new NYClamPizza();      } else {        return null;      }    }  }
   <pre name="code" class="java">public abstract class PizzaStore {    public Pizza orderPizza(String type) {      Pizza pizza = null;      pizza = createPizza(type);      pizza.prepare();      pizza.bake();      pizza.cut();      pizza.box();      return Pizza;    }
     
    protected abstract Pizza cretePizza(String type);  }


如果需要增加工厂,只需要重新继承抽象PizzaStore类。

工厂方法模式适合将客户代码从需要实例化的具体类中解耦。当不知要将来还需要实例化哪些具体类时,也可以考虑使用工厂方法模式。

工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。基类中的其他类可以自由使用这一方法而不用考虑它到底返回的是怎样的对象。如何返回要根据子类的实现。

《Head First 设计模式》中的简单工厂,将工厂方法静态去掉,本质上已经成了工厂方法模式了。而所谓的具有弹性的框架,只不过是工厂方法模式的两种实现方式罢了。例如添加一个新的Chicago PizzaStore,按照它的简单工厂也只需新继承一个ChicagoPizzaFactory,工厂方法模式则是新添加一个ChicagoPizzaStore。其中简单工厂并没有破坏DIP原则。


3. 抽象工厂模式

  抽象工厂模式提供了一个接口,用于创建相关或以来的家族。

抽象工厂利用组合将相关产品(不同类为一组)集合起来。而工厂方法模式则是利用继承将客户从实际具体产品中解耦。

public Interface PizzaIngredientFactory {    public Dough createDough();    public Sauce createSauce();    public Cheese createCheese();  }
其中每一个createXX方法都可以看作是一个工厂方法。

0 0