概念
定义一个工厂类,让子类去创建一系列相关或相互依赖的对象
角色
抽象工厂角色
具体工厂角色
抽象产品角色
具体产品角色
客户端
优点
将客户端与类的实现相分离
每个工厂都创建了一个完整的产品系列
有利于产品的一致性
缺点
难以支持新种类的(抽象)产品
例子
生产一部手机,需要手机壳、CPU、操作系统三类对象进行组装,
其中每类对象都有不同的种类。
对每个具体工厂,分别生产一部手机需要三个对象。
相比工厂方法模式,抽象工厂模式中的每个具体工厂都生产一套产品
代码示例
"""抽象工厂模式
定义一个工厂接口,让其子类去创建一系列相关或相互依赖的对象
角色:
抽象产品角色
具体产品角色
抽象工厂角色
具体工厂角色
客户端
优点:
将客户端与类的实现相分离
每个工厂创建了一个完整的产品系列
有利于产品的一致性
缺点:
难以支持新种类的(抽象)产品
"""
from abc import ABCMeta
from abc import abstractmethod
class Shell(metaclass=ABCMeta):
"""抽象产品类:Shell"""
@abstractmethod
def show_shell(self):
pass
class CPU(metaclass=ABCMeta):
"""抽象产品类:CPU"""
@abstractmethod
def show_cpu(self):
pass
class OS(metaclass=ABCMeta):
"""抽象产品类:OS"""
@abstractmethod
def show_os(self):
pass
class LargeShell(Shell):
"""具体产品类:LargeShell"""
def show_shell(self):
print(format('大号手机壳', 's'))
class SmallShell(Shell):
"""具体产品类:SmallShell"""
def show_shell(self):
print(format('小号手机壳', 's'))
class AppleShell(Shell):
"""具体产品类:AppleShell"""
def show_shell(self):
print(format('苹果手机壳', 's'))
class Android(OS):
"""具体产品类:Android"""
def show_os(self):
print(format('安卓(Android)系统', 's'))
class IOS(OS):
"""具体产品类:ISO"""
def show_os(self):
print(format('苹果IOS系统', 's'))
class SnapDragonCPU(CPU):
"""具体产品类:SnapDragonCPU"""
def show_cpu(self):
print(format('骁龙CPU', ''))
class MediaTekCPU(CPU):
"""具体产品类:MediaTekCPU"""
def show_cpu(self):
print(format('联发科CPU'))
class AppleCPU(CPU):
"""具体产品类:AppleCPU"""
def show_cpu(self):
print(format('苹果CPU'))
class PhoneFactory(metaclass=ABCMeta):
"""抽象工厂:PhoneFactory"""
@abstractmethod
def make_cpu(self):
pass
@abstractmethod
def make_os(self):
pass
@abstractmethod
def make_shell(self):
pass
class MiFactory(PhoneFactory):
"""具体工厂:MiFactory"""
def make_cpu(self):
return SnapDragonCPU()
def make_os(self):
return Android()
def make_shell(self):
return LargeShell()
class HuaweiFactory(PhoneFactory):
"""具体工厂:HuaweiFactory"""
def make_cpu(self):
return MediaTekCPU()
def make_os(self):
return Android()
def make_shell(self):
return SmallShell()
class IPhoneFactory(PhoneFactory):
"""具体工厂:IPhoneFactory"""
def make_cpu(self):
return AppleCPU()
def make_os(self):
return IOS()
def make_shell(self):
return AppleShell()
class Phone(object):
"""客户端负责组装"""
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)
phone1 = make_phone(IPhoneFactory())
phone1.show_info()
运行结果:
手机信息:
苹果CPU
苹果IOS系统
苹果手机壳
Process finished with exit code 0