工厂模式

简单工厂:简单工厂 通过把产生一个实例对象的过程,交给一个简单工厂的类去完成。

简单工厂严格来说,算不上是一种设计模式,反而比较像是一种编程习惯。

一个披萨店:根据用户的点的披萨类型  ,生产出相应类型的披萨,然后经过烘焙,切割,装盒,返回给用户。

类图:

披萨店  PizzaStore类:

 1 /**
 2  * 披萨店    PizzaStore类    根据用户要的披萨类型来生产披萨
 3  * 简单工厂 示例
 4  * @author wly
 5  *
 6  */
 7 public class PizzaStore {
 8     //声明一个SimplePizzaFactory类型的变量,用来保存简单工厂实例对象的引用
 9     public  SimplePizzaFactory  simplePizzaFactory;
10     //通过构造器,来为PizzaStore类 注入  简单工厂实例对象
11     public  PizzaStore(SimplePizzaFactory simplePizzaFactory)
12     {
13         this.simplePizzaFactory = simplePizzaFactory;
14     }
15     /**
16      * 通过传入的pizzaType来决定产生哪种类型的披萨   
17      * 然后将披萨prepare()  bake() cut() box()
18      * @param pizzaType
19      * @return
20      */
21     public Pizza  orderPizza(String  pizzaType)
22     {
23         //通过调用工厂对象的方法来产生披萨对象
24         Pizza pizza =  simplePizzaFactory.creatPizza(pizzaType);
25         
26         pizza.prepare();
27         pizza.bake();
28         pizza.cut();
29         pizza.box();
30         
31         return pizza;
32     }
33 
34 }

简单工厂     SimplePizzaFactory类:

 1 /**
 2  * 简单工厂类   SimplePizzaFactory类     
 3  * 通过简单工厂类的creatPizza方法来 产生一个  Pizza实例对象返回
 4  * @author wly
 5  *
 6  */
 7 public class SimplePizzaFactory {
 8     /**
 9      * 根据传入的披萨类型  来产生相应的披萨   并返回
10      * @param pizzaType
11      * @return
12      */
13     public Pizza creatPizza(String pizzaType) {
14         Pizza  pizza = null;
15         if(pizzaType.equals("cheese"))
16         {
17             pizza = new CheesePizza();
18         }
19         else if(pizzaType.equals("veggie"))
20         {
21             pizza = new VeggiePizza();
22         }
23         else if(pizzaType.equals("clam"))
24         {
25             pizza = new ClamPizza();
26         }
27         return pizza;
28     }
29 
30 }

简单工厂的类型形式 :静态工厂

上面两种工厂形式,都算不上真正的设计模式,下面来介绍真正的两种工厂模式:

工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

类图:

抽象父类  AbstractPizzaStore类:

 1 /**
 2  * 这是抽象的父类   AbstractPizzaStore类
 3  * @author wly
 4  *
 5  */
 6 public abstract class AbstractPizzaStore {
 7     /**
 8      * 通过传入的pizzaType来决定产生哪种类型的披萨   
 9      * 然后将披萨prepare()  bake() cut() box()
10      * @param pizzaType
11      * @return
12      */
13     public Pizza  orderPizza(String  pizzaType)
14     {
15         //通过调用工厂方法的方法来产生披萨对象
16         Pizza pizza =  creatPizza(pizzaType);
17         
18         pizza.prepare();
19         pizza.bake();
20         pizza.cut();
21         pizza.box();
22         
23         return pizza;
24     }
25     //父类中的工厂方法是抽象的  ,让具体的子类去决定如何实现工厂方法,产生Pizza对象
26     public abstract Pizza creatPizza(String pizzaType);
27         
28 }

具体子类  PizzaStore类:

 1 /**
 2  * 这是具体的子类   PizzaStore类
 3  * @author wly
 4  *
 5  */
 6 
 7 public class PizzaStore extends AbstractPizzaStore{
 8     /**
 9      * 实现父类中的抽象工厂方法  
10      */
11     @Override
12     public Pizza creatPizza(String pizzaType) {
13         Pizza  pizza = null;
14         if(pizzaType.equals("cheese"))
15         {
16             pizza = new CheesePizza();
17         }
18         else if(pizzaType.equals("veggie"))
19         {
20             pizza = new VeggiePizza();
21         }
22         else if(pizzaType.equals("clam"))
23         {
24             pizza = new ClamPizza();
25         }
26         return pizza;
27     }
28 }

  

抽象工厂模式:抽象工厂模式是在简单工厂的基础之上,对简单工厂进行抽象,形成抽象工厂类和子类工厂类。

这样,我们在需要实例对象Pizza的PizzaStore类中,通过构造器注入工厂对象时,可以面向抽象工厂类进行编程,在运行时确定是哪个子类工厂类。

这样为比较复杂的实例对象Pizza类 的实例化,提供了比较有弹性的工厂生产。

现在有一家披萨店,它有两个供货商:纽约风味的供货商,芝加哥风味的供货商。

纽约风味的供货商,提供纽约风味芝士披萨,纽约风味蔬菜披萨,纽约风味蛤蜊披萨

芝加哥风味的供货商,提供芝加哥风味芝士披萨,芝加哥风味蔬菜披萨,芝加哥风味蛤蜊披萨    

根据用户的不同选择来产生,不同的披萨:

披萨店   PizzaStore类:

 1 /**
 2  * 披萨店   PizzaStore类    
 3  * @author wly
 4  *
 5  */
 6 public class PizzaStore {
 7     //声明一个变量,用来保存工厂实例对象的引用。
 8     private  AbstractFactory  factory;
 9     
10     //通过构造器,注入抽象工厂的具体子类的实例工厂对象
11     public PizzaStore(AbstractFactory  factory)
12     {
13         this.factory = factory;
14     }
15     
16     public Pizza orderPizza(String pizzaType)
17     {
18         Pizza pizza = null;
19         //通过抽象工厂的具体子类的工厂方法来产生需要的Pizza对象
20         pizza = factory.creatPizza(pizzaType);
21         
22         pizza.prepare();
23         pizza.bake();
24         pizza.cut();
25         pizza.box();
26         
27         return pizza;
28     }
29 }

抽象工厂类     AbstractFactory类:

 1 /**
 2  * 这是抽象工厂类   AbstractFactory类 
 3  * @author wly
 4  *
 5  */
 6 public interface AbstractFactory {
 7     //这是抽象工厂的工厂方法,留给具体的子类去实现
 8     Pizza creatPizza(String pizzaType);
 9 
10 }

抽象工厂的具体实现类     NewYorkStyleFactory类:

 1 /**
 2  * 这是抽象工厂的具体的子工厂  NewYorkStyleFactory类 
 3  * @author wly
 4  *
 5  */
 6 public class NewYorkStyleFactory implements AbstractFactory {
 7     /**
 8      * 实现抽象工厂中的抽象工厂方法  ,来产生具体的Pizza对象
 9      */
10     @Override
11     public Pizza creatPizza(String pizzaType) {
12         Pizza  pizza = null;
13         if(pizzaType.equals("cheese"))
14         {
15             pizza = new NewYorkStyleCheesePizza();
16         }
17         else if(pizzaType.equals("veggie"))
18         {
19             pizza = new NewYorkStyleVeggiePizza();
20         }
21         else if(pizzaType.equals("clam"))
22         {
23             pizza = new NewYorkStyleClamPizza();
24         }
25         return pizza;
26     }
27 
28 }

 抽象工厂的具体实现类     ChicagoStyleFactory类:

 1 /**
 2  * 这是抽象工厂的具体的子工厂    ChicagoStyleFactory类 
 3  * @author wly
 4  *
 5  */
 6 public class ChicagoStyleFactory implements AbstractFactory {
 7      /**
 8      * 实现抽象工厂中的抽象工厂方法  ,来产生具体的Pizza对象
 9      */
10     @Override
11     public Pizza creatPizza(String pizzaType) {
12         Pizza  pizza = null;
13         if(pizzaType.equals("cheese"))
14         {
15             pizza = new ChicagoStyleCheesePizza();
16         }
17         else if(pizzaType.equals("veggie"))
18         {
19             pizza = new ChicagoStyleVeggiePizza();
20         }
21         else if(pizzaType.equals("clam"))
22         {
23             pizza = new ChicagoStyleClamPizza();
24         }
25         return pizza;
26     }
27 }

通过对比三个设计模式  : 简单工厂   ,  工厂方法   , 抽象工厂

三者的相同点都是  具有一个产生 PizzaStore组件所依赖的Pizza组件 的 工厂方法creatPizza()

三者的不同点是   使用何种方式来调用工厂方法creatPizza

简单工厂 :通过构造器注入一个具体的工厂实例对象,来调用属于这个工厂实例的工厂方法

工厂方法  : 工厂方法  通过具体的子类自己来调用属于自己实例的工厂方法,将产生所依赖的Pizza组件的行为,推迟到具体子类中去

抽象工厂:在简单工厂的基础之上,将工厂类在进行抽象 ,形成抽象工厂父类和具体工厂子类。面向抽象工厂父类编程,在运行时,是通过具体工厂子类的实例

             对象来调用工厂方法的。

原文地址:https://www.cnblogs.com/wangliyue/p/4204510.html