zoukankan      html  css  js  c++  java
  • 生成器模式(建造者模式)

    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生产的则是多个部件组成的单个复杂产品。

  • 相关阅读:
    Hui之组件大全
    程序员交流学习平台
    PHP 常用框架
    常用浏览器
    设计必备工具、平台
    文档必备工具
    开发必备工具
    工作必备工具
    源码托管平台、软件
    前端常用框架
  • 原文地址:https://www.cnblogs.com/zenan/p/10304579.html
Copyright © 2011-2022 走看看