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

Python设计模式(3):抽象工厂模式

作者头像
不可言诉的深渊
发布2019-07-26 17:29:48
1.3K0
发布2019-07-26 17:29:48
举报

导言

为了说明抽象工厂模式引入的背景首先回忆起Python设计模式(2):工厂方法模式类图。从图中可以看到,在工厂方法模式中针对一组产品类构造了另外一组工厂类,并且工厂类与产品类有相同的结构。假如现在有两组以上具有相同结构的产品类,是否还可以使用工厂方法模式呢?例如有3组产品,鞋(Shoes)、西装(Suit)和领带(Tie),如图所示,每类产品都分为男女两类。问题:此时是否还可以使用以上的工厂方法模式?如果回答为是,怎样应用工厂方法模式?

解决方案1:一种可能的解决方法是为每个产品层次类创建一个Creator层次类。这种方法有一个缺点,就是需要至少3个Creator层次类。这种办法是可行的,但是太麻烦。

解决方案2:以上3个层次类具有相同的结构,可以改造以上所述的工厂方法模式,使得只需要一个工厂层次类就可以担负起创建3组产品对象的责任。设计图如图所示。

第二种解决方案就是将要讲述的抽象工厂模式(Abstract Factory Pattern),包含两个产品类的的抽象工厂模式设计类图如图所示。

抽象工厂模式与工厂方法模式有相似的概念。抽象工厂模式与工厂模式一样是层次类的结构,但是在这里它不仅仅负责创建一个产品类的对象,而是一族产品类对象。在程序中,它可以是接口或者抽象类。

抽象工厂模式中包含:

  1. 一系列互相有关联的产品类,这些产品类有相同的结构。
  2. 一系列实的工厂类,实现由抽象工厂类提供的接口。每个实的工厂类生产一组相关的产品类的对象。

当客户对象要从一个相关的产品组中创建一个对象,而没有必要知道到底创建哪个对象时,可以应用抽象工厂模式。如果不使用抽象工厂模式,创建对象的条件语句将会出现在客户程序的许多地方,程序的可维护性差。抽象工厂模式帮助程序员避免了以上所述的重复的、复杂的条件语句,提供了必要的创建对象的接口。

代码语言:javascript
复制
from abc import ABC, abstractmethod


# 下面的类为工厂类接口及其子类
class Creator(ABC):
    @abstractmethod
    def factory_a(self):
        pass

    @abstractmethod
    def factory_b(self):
        pass

    @staticmethod
    def get_creator(option):
        if option == '1':
            return ConcreteCreatorA()
        elif option == '2':
            return ConcreteCreatorB()


class ConcreteCreatorA(Creator):
    def factory_a(self):
        return ProductA1()

    def factory_b(self):
        return ProductB1()


class ConcreteCreatorB(Creator):
    def factory_a(self):
        return ProductA2()

    def factory_b(self):
        return ProductB2()


# 以下类为产品类接口及其实现子类的代码
class ProductA(ABC):
    @abstractmethod
    def get_product(self):
        pass


class ProductA1(ProductA):
    def get_product(self):
        return'ProductA1'


class ProductA2(ProductA):
    def get_product(self):
        return'ProductA2'


class ProductB(ABC):
    @abstractmethod
    def get_product(self):
        pass


class ProductB1(ProductB):
    def get_product(self):
        return'ProductB1'


class ProductB2(ProductB):
    def get_product(self):
        return'ProductB2'


class Client:
    @staticmethod
    def main():
        # 获取产品类型与种类
        product_class = input("产品种类:").upper()  # A B
        product_type = input("产品类型:")  # 1 2
        # 获取具体工厂子类对象
        creator = Creator.get_creator(product_type)
        # 获得具体的产品对象
        if product_class == 'A':
            product = creator.factory_a()
            print(product.get_product())
        elif product_class == 'B':
            product = creator.factory_b()
            print(product.get_product())


if __name__ == '__main__':
    Client.main()
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

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