• 构建者(建造者)模式


    引子

    在软件系统中,有时候面临着“一个复杂对象”的创建工作,期通常由各个部分的子对象用一定的算法构成;由于需求的变化 ,这个复杂的对象各个部分经常面临着剧烈变化 ,但是将它们组合在一起的算法却是相对稳定。

    概念

    构建者模式是一个独特的设计模式,有助于使用简单的对象构造复杂的对象平使用算法。

    类图

    例子分析

    例如手机,它是由 屏幕 ,主板,处理器等等组成的,但是组成手机的这些各个部分是可变的。

    不同的型号的手机所采用的这些组件都是不一样的;如处理器有 联发科 、 高通 、 英伟达 等等。

    同理主板与手机屏目也是这样。

    复杂对象

    在这例子中复杂的对象指的是手机这东西,它是由多个子对象组成的。

    变化部分

    变化的部分指的是组成手机这对象的各个子对象,它们是可变的。

    如处理器有 联发科 、 高通 、 英伟达 等等。

    算法部分

    假设手机都是构造是这样:主板->处理器-> 屏幕 ->完成

    主板上安装处理器然后在装上屏幕一个手机就这样构造完成了。

    实现代码

    class Mobile:
        def __init__(self):
            self.__cpu = None
            self.__screen = None
            self.__master = None
    
        def set_cpu(self, value):
            self.__cpu = value
    
        def set_screen(self, value):
            self.__screen = value
    
        def set_master(self, value):
            self.__master = value
    
        def __repr__(self):
            return f' <Mobile(master={self.__master}screen={self.__screen}cpu={self.__cpu})>'
    
    
    class AbsMobileBuild(abc.ABC):
    
        def __init__(self):
            self._mobile = Mobile()
    
        # CPU部分
        @abc.abstractmethod
        def set_cpu(self):
            pass
    
        # 主板部分
        @abc.abstractmethod
        def set_master(self):
            pass
    
        # 屏幕部分
        @abc.abstractmethod
        def set_screen(self):
            pass
    
        def get_result(self) -> Mobile:
            return self._mobile
    
    
    class MobileDirector:
    
        def __init__(self, build: AbsMobileBuild):
            self.build = build
    
        def __call__(self) -> Mobile:
            self.build.set_master()
            self.build.set_cpu()
            self.build.set_screen()
            return self.build.get_result()
    
    
    class XiaoMiMobileBuild(AbsMobileBuild):
        def set_cpu(self):
            self._mobile.set_cpu("小米CUP")
    
        def set_master(self):
            self._mobile.set_master("小米主板")
    
        def set_screen(self):
            self._mobile.set_screen("小米屏幕")
    
    
    class HuaWeiMiMobileBuild(AbsMobileBuild):
        def set_cpu(self):
            self._mobile.set_cpu("华为CUP")
    
        def set_master(self):
            self._mobile.set_master("华为主板")
    
        def set_screen(self):
            self._mobile.set_screen("华为屏幕")
    
    
    if __name__ == "__main__":
        build = XiaoMiMobileBuild()
        director = MobileDirector(build)
        mobile = director()
        print(mobile)
    
        build1 = HuaWeiMiMobileBuild()
        director1 = MobileDirector(build1)
        mobile1 = director1()
    
        print(mobile1)
  • 相关阅读:
    【转】解决UpdatePanel 与 jQuery的冲突
    服务器控件的使用注意事项
    2019年8月12日星期一(系统编程)
    2019年8月9日星期五(系统编程)
    2019年8月8日星期四(系统编程)
    2019年8月1日星期四(数据结构)
    2019年7月30日星期二(数据结构)例题代码
    2019年7月31日星期三(数据结构)
    2019年7月30日星期二(数据结构)
    2019年7月29日星期一(文件IO)
  • 原文地址:https://www.cnblogs.com/whnba/p/11953972.html
Copyright © 2020-2023  润新知