---------------------------


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

导言

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

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

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

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

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

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

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

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

抽象工厂模式中包含:

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

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

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()

今天的文章有不懂的可以加群,群号:822163725,备注:小陈学Python,不备注可是会被拒绝的哦~!

Python设计模式(3):抽象工厂模式_工厂方法模式_05

Python设计模式(3):抽象工厂模式_工厂方法模式_06


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

爱我,请给我好看