设计模式--第十七章 工厂方法模式

第一章 前言
第二章 观察者模式
第三章 状态模式
第四章 中介模式
第五章 装饰器模式
第六章 单例模式
第七章 克隆模式
第八章 职责链模式
第九章 代理模式
第十章 外观模式
第十一章 迭代模式
第十二章 组合模式
第十三章 构建模式
第十四章 适配模式
第十五章 策略模式
第十六章 简单工厂模式
第十七章 工厂方法模式
第十八章 抽象工厂模式
第十九章 命令模式
第二十章 备忘录模式
第二十一章 享元模式
第二十二章 访问模式
第二十三章 模板模式
第二十四章 桥接模式
第二十五章 解释器模式
第二十六章 过滤器模式
第二十七章 对象池技术
第二十八章 回调机制
第二十九章 MVC模式
附录


第十七章 工厂方法模式

  • 1. 核心思想
  • 2. UML类图
  • 3. 框架代码
  • 4.4 模型说明
    • 4.1 设计要点
    • 4.2 优缺点
  • 5. 应用场景


1. 核心思想

工厂方法模式是简单工厂模式的一个升级版本,为解决简单工厂模式不符合“开放封闭”原则(对扩展开放,对修改封闭)的问题,我们对SimpleFactory进行了一个拆分,抽象出一个父类Factory,并增加多个子类分别负责创建不同的具体产品。

定义一个创建对象(实例化对象)的接口,让子类来决定创建哪个类的实例。工厂方法使一个类的实例化延迟到其子类。

2. UML类图

设计模式--第十七章 工厂方法模式_第1张图片

3. 框架代码

from abc import ABC, abstractmethod
import sys

class Product(ABC):
    @abstractmethod
    def feature(self):
        pass

class ProductImplA(Product):
    def feature(self):
        print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name} is running...")

class ProductImplB(Product):
    def feature(self):
        print(f"{self.__class__.__name__}/{sys._getframe().f_code.co_name} is running...")

class Factory(ABC):
    @abstractmethod
    def createProduct(self):
        pass

class ProductAFactory(Factory):
    def createProduct(self)->ProductImplA:
        return ProductImplA()

class ProductBFactory(Factory):
    def createProduct(self)->ProductImplB:
        return ProductImplB()

if __name__ == "__main__":
    ProductAFactory().createProduct().feature()
    ProductBFactory().createProduct().feature()

4.4 模型说明

4.1 设计要点

工厂方法模式中有两个要点:

  1. 子工厂类继承于Factory,每个子工厂类调用createProduct函数返回对应的具体产品类;
  2. 具体的产品类型继承于Product基类;

4.2 优缺点

  1. 优点
    • 解决了简单工厂模式不符合“开放封闭”原则的问题,使程序更容易拓展。
    • 实现简单。
  2. 缺点
    • 对于有多种分类的产品,或具有二级分类的产品,工厂方法模式并不适用。多种分类:如我们有一个电子白板程序,可以绘制各种图形,那么画笔的绘制功能可以理解为一个工厂,而图形可以理解为一种产品;图形可以根据形状分为直线、矩形、椭圆等,也可以根据颜色分为红色图形、绿色图形、蓝色图形等。二级分类:如一个家电工厂,它可能同时生产冰箱、空调和洗衣机,那么冰箱、空调、洗衣机属于一级分类;而洗衣机又可分为高效型的和节能型的,高效型洗衣机和节能型洗衣机就属于二级分类。

5. 应用场景

  1. 客户端不知道它所需要的对象的类。
  2. 工厂类希望通过其子类来决定创建哪个具体类的对象。

你可能感兴趣的:(设计模式,python,工厂方法模式,设计模式)