抽象工厂模式-设计模式-第5篇

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 当需要增加零部件的时候 例如增加 一个部件 内存条
则需要改动的代码量较大

原文地址:https://www.cnblogs.com/cavalier-chen/p/14746651.html