• 工厂模式


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

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

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

    类图:

    披萨店  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组件的行为,推迟到具体子类中去

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

                 对象来调用工厂方法的。

  • 相关阅读:
    ARM Linux异常处理之data abort(二)【转】
    ARM Linux异常处理之data abort(一)【转】
    arm的mmu学习【转】
    使用Squashfs和Overlayfs提高嵌入式Linux文件系统可靠性【转】
    【iView】100. iView踩坑集锦
    【AOP】【Publish-Event】AOP 切面编程 + Spring的publish-event 实现 监听者模式,实现补充业务逻辑开发
    【IDEA】idea打开新项目,左下角的工作栏中没有显示Services解决办法
    【java】ObjectOutputStream & ObjectInputStream 多次写入发生重复写入相同数据的问题
    【JS】时间工具类
    【MySQL】mysql优化集锦
  • 原文地址:https://www.cnblogs.com/wangliyue/p/4204510.html
Copyright © 2020-2023  润新知