zoukankan      html  css  js  c++  java
  • 创建型-工厂方法模式

    1、工厂方法模式意图:

      定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

      工厂方法模式用于为属于同一类别的产品定义对应的具体工厂类,并将具体工厂类开放给用户类来使用。

    2、应用场景:

      考虑一个榨汁机的应用场景。榨汁机可以用来制作苹果汁、西瓜汁、橘汁等,即榨汁机可以用来制作水果汁。但是,夏天的冷饮店中,为了提高制作水果汁的效率和防止味道互串等情况,可能需要分别准备三个水果榨汁机,分别用来生产苹果汁、西瓜汁、橘汁等。

    3、工厂方法模式类图:

         

    角色

    • Product:定义工厂方法所创建对象。如场景描述中的果汁。
    • ConcreteProduct:实现Product中的接口,定义具体化的产品。如场景描述中的苹果汁、西瓜汁、橘汁等。
    • Creator:用于声明创建Product类型对象的工厂方法。如场景中的榨汁机这一概念。
    • ConcreteCreator:实现Creator中的工厂方法,专门用于产生具体的产品ConcreteProduct。如场景中的苹果榨汁机、西瓜榨汁机等。

    协作

    • Creator依赖于它的子类来定义工厂方法。

    4、适用性:

    工厂方法模式跟工厂模式类似,其中工厂方法模式适合于构造同属于同一个类别的不同产品,所有的产品属于同一个系列中。

    5、实例:

    5.1 实例类图:

         

    说明:店员(Waiter)使用不同的榨汁机来制作不同的水果汁,进而销售给顾客。

    5.2 Waiter类:

    除了用户类Waiter类之外,其他的类定义明了,故仅提供用户类。

    1 public class Waiter{
    2       
    3     public void sell(Juicer juicer){
    4         Juice juice = juicer.MakeJuice();    //使用传入的特定的榨汁机来生产特定的水果汁
    5 
    6         //卖给顾客,收钱
    7     }
    8 
    9 }

    6、特点

    • 连接平行的类层次——工厂方法的每个子类用于产生平行的不同的具体产品,工厂子类同具体产品平行关系;每种新类型产品都需要对应一个新类型产品的工厂类;
    • 添加新类型产品时,面向的是抽象产品接口(Product);添加新类型产品的工厂类时,面向的是抽象工厂接口(Creator);
    • 在用户类需要添加新类型的产品(NewProduct)时,只需要添加对应的新工厂类(NewProductFactory),不需要修改已经存在的其他类。在用户类需要使用新产品时,只需要调用新工厂类(NewProductFactory)来获取新产品即可。符合开闭原则。

    【注:开闭原则——软件开发应该面向扩展,而非修改。】

    7、简单工厂VS工厂方法

    简单工厂:不满足开闭原则。在需要添加新类型产品时,除添加新产品类,还需要修改简单工厂模式中的工厂类,为工厂类中创建对象的静态方法添加新的选择项。

    工厂方法:满足开闭原则。在需要添加新类型产品时,除添加新产品类,还需要继承抽象工厂类,创建新类型产品对应的工厂类。

  • 相关阅读:
    DB2 9 基础根基(730 测验)认证指南,第 2 部门: 安适性(1)
    DB2 9 根底(730 考验)认证指南,第 3 部门: 访问 DB2 数据(7)
    IT人 软件工程师的务实职业生涯规划
    《Delphi 算法与数据结构》学习与感悟[8]: 单向链表的添加、删除与遍历
    《Delphi 算法与数据结构》简介及下载
    《Delphi 算法与数据结构》学习与感悟[1]: 通过 "顺序查找" 与 "二分查找" 说明算法的重要性
    《Delphi 算法与数据结构》学习与感悟[2]: 数据对齐
    学习 TTreeView [14] StateIndex(状态图标)、OverlayIndex(叠加图标)
    《Delphi 算法与数据结构》学习与感悟[3]: 获取一个字节中非空位的个数
    《Delphi 算法与数据结构》学习与感悟[6]: 一个简单的"单向链表"
  • 原文地址:https://www.cnblogs.com/-crazysnail/p/3924125.html
Copyright © 2011-2022 走看看