抽象工厂模式
概述
- 定义一个工厂类接口,让工厂子类来创建一系列相关或者相互依赖的对象
- 相对于工厂方法模式,抽象工厂模式中每个具体工厂都生产一套产品
角色
- 抽象工厂角色(Creator)
- 具体工厂角色(Concrete Creator)
- 抽象产品角色(Product)
- 具体产品角色(Concrete Product)
- 客户端(client)
例子
- 生产手机,需要手机壳、CPU、操作系统三类对象进行组装,其中每类对象都有不同种类。对每个具体工厂,分别生产生产一部手机所需的三个对象
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 show_cpu(self):
print("骁龙CPU")
class MediaTekCPU(CPU):
def show_cpu(self):
print("联发科CPU")
class AppleCPU(CPU):
def show_cpu(self):
print("苹果CPU")
class IOS(OS):
def show_os(self):
print("苹果系统")
class AndroidOS(OS):
def show_os(self):
print("安卓系统")
"""具体工厂"""
class MiFactory(PhoneFactory):
def make_shell(self):
return AppleShell()
def make_cpu(self):
return SnapDragonCPU()
def make_os(self):
return IOS()
"""客户端"""
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)
p = make_phone(MiFactory())
p.show_info()
优点
- 将客户端与类的具体实现相分离
- 每个工厂创建一系列的完整产品系列,使得易于交换产品系列
- 有利于产品的一致性
缺点