专业介绍:
抽象工厂模式提供一个 "创建一系列相关或相互依赖对象" 的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
通俗介绍:
它是工厂方法模式的升级版。工厂方法是一个具体工厂只生产一个种产品,如果要扩展产品,就必须扩展具体工厂。
但有时候我们需要一个工厂生产多种产品,这多种产品是属于一个产品族的,比如Wear工厂生产Clothes,Shoe,Pant等。这些都属于一个产品族(穿),但不同等级。
引入两个新概念:
产品族:由同一个工厂生产,但不同种类/结构。如某工厂生产不仅生产各种品牌的电视,还生产各种品牌的洗衣机。
产品等级:在抽象工厂模式中,一个工厂内不同的方法生产不同等级的产品,如果电视和洗衣机可叫做不同等级。
使用抽象工厂模式一般要满足以下条件:
- 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级的产品。
- 系统一次只可能消费其中某一族产品,即同族的产品一起使用。
抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下:
- 一个工厂类管理了不同等级的产品的创建
- 当增加一个新的产品族时不需要修改原代码,满足开闭原则。
缺点是:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改(增加生产 "新不同等级产品" 的方法)。
抽象工厂拥有与工厂方法相同的四个角色:分别是抽象工厂、具体工厂、抽象产品、具体产品 。
代码:
# coding=utf-8
# 抽象工厂模式
import abc, six
# step-1: 创建抽象工厂
@six.add_metaclass(abc.ABCMeta)
class AbstractFactory:
@abc.abstractmethod
def produce_people(self, name):
"""生产人类"""
pass
@abc.abstractmethod
def produce_ipad(self, version):
"""生产电子设备"""
pass
# step-2: 创建抽象产品
@six.add_metaclass(abc.ABCMeta)
class AbstractPeople:
@abc.abstractmethod
def eat(self):
pass
# step-2.1: 创建不同等级的抽象产品(但由同一工厂类管理)
@six.add_metaclass(abc.ABCMeta)
class AbstractElectronic:
@abc.abstractmethod
def display(self):
pass
@property
@abc.abstractmethod
def price(self):
"""价格是一个属性"""
return 0
# step-3: 创建具体产品
class Chinese(AbstractPeople):
def __init__(self, name):
self.name = name
def eat(self):
print(f'I am a Chinese,named {self.name}, I eat rice~')
# step-3.1: 创建不同等级的具体产品
class Ipad(AbstractElectronic):
def __init__(self, version, price):
self.v = version
self._price = price
def display(self):
print(f'This is a sliver ipad-{self.v},price is {self.price}')
@property
def price(self):
return self._price
# step-4: 创建具体工厂(这里仅一个工厂管理2种产品的创建)
class Factory(AbstractFactory):
def produce_people(self, name):
return Chinese(name)
def produce_ipad(self, version):
return Ipad(version, 6699)
if __name__ == '__main__':
# 一个工厂创建不同等级的产品,当需要增加不同等级的产品时,需要修改所有的工厂类
# 如果是增加新的产品族,就增加新的抽象产品,具体产品,具体工厂即可
factory = Factory()
ChineseA = factory.produce_people('A')
ChineseA.eat() # I am a Chinese,named A, I eat rice~
Ipad4 = factory.produce_ipad(4)
Ipad4.display() # This is a sliver ipad-4,price is 6699
备注:关于abc, six库的基本用法参考文章 简单工厂模式 & Python示例 底部的介绍,: )
欢迎留言~
参考文章: