构建者(建造者)模式

阿里云2000元红包!本站用户参与享受九折优惠!

引子

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

概念

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

类图

例子分析

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

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

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

复杂对象

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

变化部分

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

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

算法部分

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

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

实现代码

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)

 

https://www.cnblogs.com/whnba/p/11953972.html

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论