前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python设计模式(2):工厂方法模式

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

作者头像
不可言诉的深渊
发布2019-07-26 17:19:51
6080
发布2019-07-26 17:19:51
举报
文章被收录于专栏:Python机器学习算法说书人

导言

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

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

代码语言:javascript
复制
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. 工厂方法模式支持开闭原则。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python机器学习算法说书人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档