生成器模式(建造者模式)

亡梦爱人 提交于 2020-01-11 21:03:42

Builder Pattern

定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

结构:

  • Builder:抽象建造者
  • ConcreteBuilder:具体建造者
  • Director:指挥者
  • Product:产品角色

● Builder(抽象建造者):它为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类方法是buildPartX(),它们用于创建复杂对象的各个部件;另一类方法是getResult(),它们用于返回复杂对象。Builder既可以是抽象类,也可以是接口。
●ConcreteBuilder(具体建造者):它实现了Builder接口,实现各个部件的具体构造和装配方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。
●Product(产品角色):它是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义它的装配过程。
● Director(指挥者):指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。客户端一般只需要与指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者对象(也可以通过配置文件和反射机制),然后通过指挥者类的构造函数或者Setter方法将该对象传入指挥者类中。

 

from abc import ABCMeta, abstractmethod


class Laptop(metaclass=ABCMeta):
    """Builder"""

    @abstractmethod
    def build_cpu(self, interface_cpu):
        """创建cpu"""

    @abstractmethod
    def build_mainboard(self, interface_mainboard):
        """创建主板"""

    @abstractmethod
    def build_hard_disk(self, interface_hard_disk):
        """创建硬盘"""

    @abstractmethod
    def build_compose_laptop(self):
        """组装电脑"""


class Director:
    """指挥者Director,与客户端交互"""

    def __init__(self, brand, cpu, mainboard, hard_disk):
        """

        :param brand: 品牌
        :param cpu: cpu生产商实例
        :param mainboard: 主板生产商实例
        :param hard_disk: 硬盘生产商实例
        """
        if all((isinstance(brand, Laptop), isinstance(cpu, Cpu), isinstance(mainboard, MainBoard),
                isinstance(hard_disk, HardDisk))):
            self._brand = brand
            self._cpu = cpu
            self._mainboard = mainboard
            self._hard_disk = hard_disk
        else:
            raise (Exception)

    def main(self):
        self._brand.build_cpu(self._cpu)
        self._brand.build_mainboard(self._mainboard)
        self._brand.build_hard_disk(self._hard_disk)
        laptop = self._brand.build_compose_laptop()
        return laptop


class HuaWeiLaptop(Laptop):
    """华为笔记本具体类"""

    def build_cpu(self, interface_cpu):
        self.cpu = interface_cpu.get_cpu()

    def build_mainboard(self, interface_mainboard):
        self.mainboard = interface_mainboard.get_mainboard()

    def build_hard_disk(self, interface_hard_disk):
        self.hard_disk = interface_hard_disk.get_hard_disk()

    def build_compose_laptop(self):
        laptop = (self.cpu, self.mainboard, self.hard_disk)
        return laptop


class XiaoMiLaptop(Laptop):
    """小米笔记本具体类"""

    def build_cpu(self, interface_cpu):
        self.cpu = interface_cpu.get_cpu()

    def build_mainboard(self, interface_mainboard):
        self.mainboard = interface_mainboard.get_mainboard()

    def build_hard_disk(self, interface_hard_disk):
        self.hard_disk = interface_hard_disk.get_hard_disk()

    def build_compose_laptop(self):
        laptop = (self.cpu, self.mainboard, self.hard_disk)
        return laptop


class Cpu(metaclass=ABCMeta):
    @abstractmethod
    def get_cpu(self):
        """生产cpu"""


class MainBoard(metaclass=ABCMeta):
    @abstractmethod
    def get_mainboard(self):
        """生产主板"""


class HardDisk(metaclass=ABCMeta):
    @abstractmethod
    def get_hard_disk(self):
        """生产硬盘"""


class InterCore(Cpu):
    def get_cpu(self):
        cpu = "I7-7700HQ"
        return cpu


class SanXing(HardDisk):
    def get_hard_disk(self):
        hard_disk = "固态颗粒"
        return hard_disk


class JinShiDun(HardDisk):
    def get_hard_disk(self):
        hard_disk = "机械硬盘"
        return hard_disk


class Asus(MainBoard):
    def get_mainboard(self):
        mainboard = "坚如磐石硕主板"
        return mainboard


if __name__ == "__main__":
    huaweiProduct = HuaWeiLaptop()
    xiaomiProduct = XiaoMiLaptop()
    interCoreProduct = InterCore()
    AsusProduct = Asus()
    sanXingProduct = SanXing()
    jinShiDunProduct = JinShiDun()

    d1 = Director(huaweiProduct, interCoreProduct, AsusProduct, sanXingProduct)
    print(d1.main())
    d2 = Director(xiaomiProduct, interCoreProduct, AsusProduct, jinShiDunProduct)
    print(d2.main())

 

建造者模式的builder抽象类和抽象工厂的抽象工厂类的不同之处在于抽象工厂生产的是多个完整的产品,而builder生产的则是多个部件组成的单个复杂产品。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!