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

Python设计模式(1):简单工厂方法模式

作者头像
不可言诉的深渊
发布2019-07-26 17:26:56
8140
发布2019-07-26 17:26:56
举报

简单工厂方法模式(the Simple Factory Method Pattern)的设计类图如图所示。图中的Creator类是一个工厂类。根据“四人帮”(Gang of Four,GOF)的软件设计模式的记号,图中的右半部分类叫做产品类,由接口Product与具体的实现类产品类ConcreteProduct组成。

产品类实际上代表被创建的类的结构,而Creator类是简单工厂方法模式的核心部分。Creator类是简单工厂方法的核心部分。Creator类拥有一个方法factory(),即工厂方法,该方法负责创建产品类对象。简单工厂方法模式的特点是仅仅有一个具体的(Concrete)创建者类,并且在此类中包含一个静态工厂方法factory()。

简单工厂方法模式所包含的各组成部分意义如下。

  1. Creator:是简单工厂方法模式的核心,包含应用程序所需要的业务逻辑,当客户类Client需要的时候,委托工厂类创建产品类的对象。
  2. Product:可以是接口或者抽象类,是具体子类的超类或者共同接口。
  3. ConcreteProduct:实现Product接口,或者继承抽象类Product。
代码语言:javascript
复制
from abc import ABC, abstractmethod


class Creator:
    @staticmethod
    def get_product(option):
        product = None
        if option == 1:
            product = ConcreteProduct1()
        elif option == 2:
            product = ConcreteProduct2()
        return product


class Product(ABC):
    @abstractmethod
    def get_product_info(self):
        raise NotImplementedError


class ConcreteProduct1(Product):
    def get_product_info(self):
        return'ConcreteProduct1'


class ConcreteProduct2(Product):
    def get_product_info(self):
        return'ConcreteProduct2'


class Client:
    @staticmethod
    def main():
        print('Product types:ConcreteProduct1(1),ConcreteProduct2(2)')
        option0 = int(input('Please select:'))
        print(Creator.get_product(option0).get_product_info())


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

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

  1. 工厂方法包含从一个类的结构中选择初始类的业务逻辑。
  2. 客户类不直接创建产品类的对象,客户类只作为对象的消费者。
  3. 简单工厂方法模式实现了责任分离。
  4. 客户类不负有创建类的对象的责任,因此如果有新产品子类加入,不必修改已有的客户类代码(前提是客户类暂时不需要使用新的产品子类对象)。
  5. 因为工厂类中包含了对象生成的必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,所以客户端类中没有创建对象所需要的条件语句。

简单工厂方法模式的缺点如下:

  1. 由于工厂类必须知道怎样创建每个子类的对象,所以每当增加产品类的时候,都需要修改工厂类代码。简单工厂方法模式不符合开闭原则。
  2. 简单工厂类只能是一个单独的类,而不能成为一个层次的类。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

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