1. 定义
定义一个工厂类接口,让工厂子类 创建一系列相关或相互依赖的对象
举例:
生产一部手机,需要手机壳, CPU, 操作系统三大类对象进行组装,
手机壳有不同的种类,大手机壳,小手机壳,
CPU也有种鸽种类,高通,骁龙,等等
操作系统有多个种类,比如,ios,android
对于每个具体的工厂,生产一部手机,需要三个对象,
相比工厂方法模式,抽象工厂模式中的每个具体工厂都生产一套产品
2. 代码
from abc import abstractmethod, ABCMeta
# ---------抽象产品-----------
class PhoneShell(metaclass=ABCMeta):
@abstractmethod
def show_shell(self):
pass
class CPU(metaclass=ABCMeta):
@abstractmethod
def show_cpu(self):
pass
class OS(metaclass=ABCMeta):
@abstractmethod
def show_os(self):
pass
# --------抽象工厂--------
class PhoneFactory(metaclass=ABCMeta):
@abstractmethod
def make_shell(self):
pass
@abstractmethod
def make_cpu(self):
pass
@abstractmethod
def make_os(self):
pass
# ------具体的产品-------
class SmallShell(PhoneShell):
def show_shell(self):
print("普通的小手机壳")
class BigShell(PhoneShell):
def show_shell(self):
print("普通的大手机壳子")
class AppleShell(PhoneShell):
def show_shell(self):
print("苹果手机壳子。。。")
class SnapDragnCPU(CPU):
def show_cpu(self):
print("骁龙手机CPU。。。。")
class MediaTekCPU(CPU):
def show_cpu(self):
print("联发科 手机CPU ....")
class AppleCPU(CPU):
def show_cpu(self):
print("苹果手机 CPU 。。。")
class AndroidOS(OS):
def show_os(self):
print("安卓手机操作系统")
class IOS(OS):
def show_os(self):
print("苹果手机操作体统。。。")
# ---------具体的工厂-------
class XiaoMiFactory(PhoneFactory):
def make_shell(self):
return BigShell()
def make_cpu(self):
return SnapDragnCPU()
def make_os(self):
return AndroidOS()
class IPhoneFactory(PhoneFactory):
def make_os(self):
return IOS()
def make_cpu(self):
return AppleCPU()
def make_shell(self):
return AppleShell()
# --- 客户端 ----
class Phone:
def __init__(self, cpu, os, shell):
self.cpu = cpu
self.os = os
self.shell = shell
def show_info(self):
print("手机信息:")
self.cpu.show_cpu()
self.os.show_os()
self.shell.show_shell()
def make_phone(factory):
cpu = factory.make_cpu()
os = factory.make_os()
shell = factory.make_shell()
return Phone(cpu, os, shell)
if __name__ == '__main__':
phone1 = make_phone(XiaoMiFactory())
phone1.show_info()
print("------------------")
phone2 = make_phone(IPhoneFactory())
phone2.show_info()
3 优缺点
优缺点:
每个工厂创建了一个完整的产品系列,
有利于产品的一致性
缺点:
难以支持新种类的抽象产品
例如 PhoneFactory 当需要增加零部件的时候 例如增加 一个部件 内存条
则需要改动的代码量较大