创建型模式 --- 抽象工厂模式--- 内容: 定义一个工厂类接口,让工厂子类来创建一系列相关或相互依赖的对象 相比工厂方法模式,抽象工厂模式中的每个具体工厂都生产一套产品 角色: 1. 抽象工厂角色 (Creator) 2. 具体工厂角色 (Concrete Creator) 3. 抽象产品角色 (Product) 4. 具体产品角色 (Concrete Product) 5. 客户端 (Client) 优点: 1. 将客户端与类的具体实现相分离 2. 每个工厂创建了一个完整的产品系列,使得易于交换产品系列 3. 有利于产品的一致性 (即产品之间的约束关系) 缺点: 1. 难以支持新种类的 (抽象) 产品
from abc import ABCMeta, abstractmethod
# ------ 抽象产品 ------
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 SnapDragonCPU(CPU):
def __init__(self, high_config=False):
self.high_config = high_config
def show_cpu(self):
if self.high_config:
print('骁龙CPU (高配版)')
else:
print('骁龙CPU')
class MediaTekCPU(CPU):
def show_cpu(self):
print('联发科CPU')
class AppleCPU(CPU):
def show_cpu(self):
print('苹果CPU')
class Android(OS):
def show_os(self):
print('Android 系统')
class IOS(OS):
def show_os(self):
print('IOS 系统')
# ------ 具体工厂 ------
class MiFactory(PhoneFactory):
def make_shell(self):
return BigShell()
def make_cpu(self):
return SnapDragonCPU(high_config=True)
def make_os(self):
return Android()
class HuaweiFactory(PhoneFactory):
def make_shell(self):
return SmallShell()
def make_cpu(self):
return MediaTekCPU()
def make_os(self):
return Android()
class IPhoneFactory(PhoneFactory):
def make_shell(self):
return AppleShell()
def make_cpu(self):
return AppleCPU()
def make_os(self):
return IOS()
# ------ client ------
class Phone(object):
def __init__(self, shell, cpu, os):
self.shell = shell
self.cpu = cpu
self.os =os
def show_info(self):
print('手机信息:')
self.shell.show_shell()
self.cpu.show_cpu()
self.os.show_os()
def make_phone(factory):
shell = factory.make_shell()
cpu = factory.make_cpu()
os = factory.make_os()
return Phone(shell, cpu, os)
# --- Client ---
p1 = make_phone(MiFactory())
p1.show_info()
p2 = make_phone(IPhoneFactory())
p2.show_info()