设计模式之简单工厂

来源:互联网 发布:威锋网mac 编辑:程序博客网 时间:2024/04/29 08:13

之前已经学过“针对接口编程,而不是针对实现编程”,但是,当使用“new”时,却的确是在实例化一个具体类,所以用的是具体实现,而不是接口。

[java] view plaincopy
  1. Duck duck = new MallardDuck( );  

上面就是常用的实例化的new 方法。


用"new"有什么不好呢? 

在技术上,new 没错,都是“改变”的错。

针对接口编程,可以隔离掉以后系统可能发生的一大堆改变。因为如果是针对接口而写,那么通过多态,它可以与任何新类实现该接口。

但是,使用大量的具体类时,也是自找麻烦,因为一旦加入新的具体类,就必须改变代码。也就是说,你的代码并非“对修改关闭”。相用新的类必须重新打开它。



认识简单工厂模式

假设要开一个比萨店,要获取很多不同类型的比萨,那么我们可以写这样一个方法来获取比萨对象:

[java] view plaincopy
  1. Pizza orderPizza(String type){  
  2.     Pizza pizza;  
  3.   
  4.     if(type.equals("chees")){  
  5.         pizza = new CheesePizza();  
  6.     }else if(type.equals("greek")){  
  7.         pizza = new GreekPizza();   
  8.     }else if(type.equals("pepperoni")){  
  9.         pizza = new PepperoniPizza();  
  10.     }  
  11.   
  12.     pizza.prepare();  
  13.     pizza.bake();  
  14.     pizza.cut();  
  15.     pizza.box();  
  16.   
  17.     return pizza;  
  18. }  



当比萨类型改变,或删除时,上面的代码就要改变,不符合设计原则。


所以我们把创建对象移到orderPizza()之外,由这个对象专职创建比萨。


SimplePizzaFactory只做一件事情:帮它的客户创建比萨。 

[java] view plaincopy
  1. public class SimplePizzaFactory {  
  2.   
  3.     public Pizza createPizza(String type) {  
  4.         Pizza pizza = null;  
  5.   
  6.         if (type.equals("cheese")) {  
  7.             pizza = new CheesePizza();  
  8.         } else if (type.equals("pepperoni")) {  
  9.             pizza = new PepperoniPizza();  
  10.         } else if (type.equals("clam")) {  
  11.             pizza = new ClamPizza();  
  12.         } else if (type.equals("veggie")) {  
  13.             pizza = new VeggiePizza();  
  14.         }  
  15.         return pizza;  
  16.     }  
  17. }  


上面对象就是工厂(factory),工厂处理创建对象的细节。



下面重做比萨店:


PizzaStore类,使用SimplePizzaFactory对象来创建比萨 

[java] view plaincopy
  1. public class PizzaStore {  
  2.     SimplePizzaFactory factory;  
  3.    
  4.     public PizzaStore(SimplePizzaFactory factory) {   
  5.         this.factory = factory;  
  6.     }  
  7.    
  8.     public Pizza orderPizza(String type) {  
  9.         Pizza pizza;  
  10.    
  11.         pizza = factory.createPizza(type);  //注意,把new变成了工厂的创建方法!不再使用具体实例化!  
  12.    
  13.         pizza.prepare();  
  14.         pizza.bake();  
  15.         pizza.cut();  
  16.         pizza.box();  
  17.   
  18.         return pizza;  
  19.     }  
  20.   
  21. }  






定义简单工厂模式

简单工厂其实不是一个设计模式,反而是一种编程习惯,但是却经常使用。

简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。







原创粉丝点击