工厂模式

来源:互联网 发布:信天翁 爱情 知乎 编辑:程序博客网 时间:2024/06/08 02:33
设计模式原则之中有一点是不应该针对实现编程,但是每次new的时候实际就是针对实现编程。
针对实现编程会带来很多问题,会使代码更脆弱,缺乏弹性。如
Person p;if(sex="男人")   p=new Man();else p=new Woman();
如果改天我们想再加一个小孩呢?这就需要对这段代码重新修改。这样的修改很容易犯错,造成系统的局部更新维护。好的代码都是对扩展开发对修改关闭
但是该代码并没有“修改关闭”
这样我们该如何解决呢?设计原则中有一条是“找出变化的方面,把它们从不变的部分分离出来”。于是引入了工厂模式
工厂模式实际上算不算一种设计模式,反而更像一种编程习惯,将该重复的代码提出来来进行统一的管理。
Pizza orderPizza(String type){Pizza pizza;if(type.equals("Cheese"))   pizza=new CheesePizza();else if(type.equals("Greek"))   pizza=new GreekPizza();pizza.prepare();pizza.bake();pizza.cut();pizza.box();return pizza;}
从这个代码中我们可以看出,每个pizza的创建都要根据type来决定,如果有一天我们要新增一个口味的pizza。
这样如果只有一个pizza店的话,还好办,就在该pizza店的orderPizza方法中修改该if判断来新增。但是如果有很多pizza店的话,就会疯狂,每个pizza店类都要对orderPizza方法进行修改。
如果我们将这部分判出创建Pizza类的方法提出来,变为一个类,每个pizza店都引用该类来创建pizza。每个pizza店只需要知道使用该类能得到Pizza,不需要知道细节,这样可以实现解耦
代码变为:
Pizza orderPizza(String type){Pizza pizza;该代码提出封装!pizza.prepare();pizza.bake();pizza.cut();pizza.box();return pizza;}public class SimplePizzaFactory{   public Pizza createPizza(String type){      if(type.equals("Cheese"))            pizza=new CheesePizza();      else if(type.equals("Greek"))           pizza=new GreekPizza();   }}
下面就是我们的PizzaStore类了
public class PizzaStore{    SimplePizzaFactory factory;   public PizzaStore(SimplePizzaFactory factory){    this.factory=factory;    }public Pizza orderPizza(String type){  Pizza pizza;  pizza=factory.createPizza(type);  pizza.prepare();  pizza.bake();  pizza.cut();  pizza.box();  return pizza; }}
这样便实现了工厂模式,将创建的代码包装为一个类,当以后实现改变时,只需要修改这个类即可。这样的最大好处就是所有关于该类的创建都封装提出,这样如果创建改变,只需要改变该工厂类即可,而不需要所有的创建部分都更改。
这个只是最简单的工厂模式,下面还有两个最主要的工厂类模式:工厂方法和抽象工厂模式。
1 0
原创粉丝点击