专栏首页Python机器学习算法说书人Python设计模式(2):工厂方法模式

Python设计模式(2):工厂方法模式

导言

为了克服简单工厂方法模式的缺点,人们试图改善工厂类的结构。导致简单工厂方法模式不符合开闭原则的原因是工厂方法类只是一个实类,每当有一个新的产品类被加入到产品类的结构中时,在工厂方法类中就必须增加适当的条件语句,以便能够在合适的条件下创建新增加的类的实例。经过以上分析,软件设计者们发现,可以将简单工厂方法模式中单一的工厂类改写为一个层次类来解决这个问题。首先需要一个接口作为超类,名为creator,接口中有一个方法,叫做factory();然后可以用产品类相同的结构产生创建者类结构,其中包含creatorA和creatorB,各自负责创建相应的ProductA和ProductB对象,如图所示。

在图中,每个产品类对应一个工厂类。该工厂类只负责创建相应的产品类对象,例如工厂类CreatorA只负责创建类ProductA的对象,而工厂类CreatorB只负责创建类ProductB对象。

from abc import ABC, abstractmethod


class Client:
    @staticmethod
    def main():
        option = input("A:ProductA,B:ProductB\n请选择:").strip().upper()
        creator = None
        # 创建工厂子类对象creator
        if option == 'A':
            creator = CreatorA()
        elif option == 'B':
            creator = CreatorB()
        # 调用工厂方法,获得一个具体的产品子类对象
        product = creator.factory()
        # 使用该产品子类对象做相应的操作
        print(product.get_info())


# 以下类为工厂类接口及其实现子类。每个工厂子类仅仅负责创建一种产品对象。因此每个工厂子类都不包含条件语句。
class Creator(ABC):
    @abstractmethod
    def factory(self):
        pass


class CreatorA(Creator):
    def factory(self):
        return ProductA()


class CreatorB(Creator):
    def factory(self):
        return ProductB()


# 以下类为产品接口及其实现子类
class Product(ABC):
    @abstractmethod
    def get_info(self):
        pass


class ProductA(Product):
    def get_info(self):
        return'ProductA'


class ProductB(Product):
    def get_info(self):
        return'ProductB'


if __name__ == '__main__':
    Client.main()

简单工厂方法模式与工厂方法模式的相同之处与简单工厂方法模式一样,工厂方法模式中的工厂方法也返回一个属于父类Product类型的对象,客户不必知道返回对象的具体类型。

简单工厂方法模式与工厂方法模式的区别如下:

  1. 两个模式的中心不同。工厂方法模式的中心是抽象工厂类或者接口,而简单工厂方法模式的中心是一个实的工厂类(Concrete Factory Class)。 在简单工厂模式类中,工厂方法是静态(Static)的,而在工厂模式中工厂方法是动态的(Dynamic)。
  2. 简单工厂模式不支持开闭原则,工厂方法模式支持开闭原则。在简单工厂模式中,如果要增加一个新的产品类,相应地在工厂类中也要增加一个条件语句,用于创建一个新的产品类对象。也就是说,必须修改工厂类的源代码。因此简单工厂模式不支持开闭原则。 在工厂方法模式中,增加新产品,只需在Product类的结构体中增加一个实类,并且在工厂类的层次结构体中增加一个增加一个相应的能产生该新产品类对象的实类。这种模式无需修改或者重新编译抽象的工厂方法类与已经存在的具体的工厂方法类。这样,在无需修改或者重新编译已经存在的代码的情况下,可以添加新的产品类(当然也必须同时添加工厂方法类)。因此工厂方法模式支持开闭原则。
  3. 在简单工厂模式中,必要的创建对象的逻辑判断包含在工厂类中;在工厂方法模式中,工厂类不必包含创建对象的逻辑判断。

在以下任何一种情况下,可以使用工厂方法模式。

  1. 创建某些类的对象的逻辑比较复杂,并且有很多条件分支,而且还可能增加新的条件。
  2. 一个类不能预先准确地知道它必须创建一个层次类中的哪个子类对象。
  3. 一个类使用它的子类决定所要创建的对象。
  4. 需要封装创建类的对象的逻辑,使得这些逻辑局部化。

工厂方法模式的优点如下:

  1. 工厂方法模式将创建对象的逻辑与任务交给了工厂类。
  2. 工厂方法模式支持开闭原则。

本文分享自微信公众号 - Python机器学习算法说书人(Python-ML-Algorithm),作者:小陈学Python

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python 文件分类

    文件分类应该是大家每天都在做的事情。假设现在有一大批文件(这一大批文件类型不定,也就是说有些是文本文件有些是二进制文件)都被放在了一个文件夹中,需要对它们进行一...

    不可言诉的深渊
  • Python设计模式(3):抽象工厂模式

    为了说明抽象工厂模式引入的背景首先回忆起Python设计模式(2):工厂方法模式类图。从图中可以看到,在工厂方法模式中针对一组产品类构造了另外一组工厂类,并且工...

    不可言诉的深渊
  • 增强版磁力链接搜索神器

    比特洪流(BitTorrent)是一种内容分发协议,由布拉姆·科恩自主开发。它采用高效的软件分发系统和点对点技术共享大体积文件(如一部电影或电视节目),并使每个...

    不可言诉的深渊
  • TypeScript 设计模式之抽象工厂

    在现实生活中,工厂是负责生产产品的,比如牛奶、面包或礼物等,这些产品满足了我们日常的生理需求。

    阿宝哥
  • 23种设计模式之工厂方法模式

    定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类. 工厂方法使一个类的实例化延迟到其子类

    烟草的香味
  • 工厂方法模式(Factory Method)-最易懂的设计模式解析

    在上文提到的最易懂的设计模式系列解析:简单工厂模式,发现简单工厂模式存在一系列问题:

    Carson.Ho
  • 大话设计模式笔记(五)——代理模式和工厂方法模式

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    逝兮诚
  • 三分钟理解“工厂模式”——设计模式轻松掌握

    举个例子 假设需要我们写一个简单的计算器,能实现加减乘除运算,仅要求输入两个数,选择运算符,计算出结果就行了。 使用简单工厂模式的设计如下: ? 工厂类提供了一...

    大闲人柴毛毛
  • 工厂方法模式 创建型 设计模式(三)

    核心的工厂角色,不再是具体的工厂,也就是不再负责所有具体产品的创建,进一步转变为抽象角色。

    noteless
  • Typescript 设计模式之工厂方法

    在现实生活中,工厂是负责生产产品的,比如牛奶、面包或礼物等,这些产品满足了我们日常的生理需求。此外,在日常生活中,我们也离不开大大小小的系统,这些系统是由不同的...

    阿宝哥

扫码关注云+社区

领取腾讯云代金券