首页 > 编程语言 >Python: Builder Pattern

Python: Builder Pattern

时间:2022-10-19 18:16:44浏览次数:40  
标签:builder product Python Pattern Builder None self def

 DuBuilder.py

# 生成器模式 Builder Pattern
from __future__ import annotations
from abc import ABC, abstractmethod
from typing import Any


class Builder(ABC):
    """
    The Builder interface specifies methods for creating the different parts of
    the Product objects.
    """

    @property
    @abstractmethod
    def product(self) -> None:
        pass

    @abstractmethod
    def produce_part_a(self) -> None:
        pass

    @abstractmethod
    def produce_part_b(self) -> None:
        pass

    @abstractmethod
    def produce_part_c(self) -> None:
        pass


class ConcreteBuilder1(Builder):
    """
    The Concrete Builder classes follow the Builder interface and provide
    specific implementations of the building steps. Your program may have
    several variations of Builders, implemented differently.
    """

    def __init__(self) -> None:
        """
        A fresh builder instance should contain a blank product object, which is
        used in further assembly.
        """
        self.reset()

    def reset(self) -> None:
        self._product = Product1()

    @property
    def product(self) -> Product1:
        """
        Concrete Builders are supposed to provide their own methods for
        retrieving results. That's because various types of builders may create
        entirely different products that don't follow the same interface.
        Therefore, such methods cannot be declared in the base Builder interface
        (at least in a statically typed programming language).

        Usually, after returning the end result to the client, a builder
        instance is expected to be ready to start producing another product.
        That's why it's a usual practice to call the reset method at the end of
        the `getProduct` method body. However, this behavior is not mandatory,
        and you can make your builders wait for an explicit reset call from the
        client code before disposing of the previous result.
        """
        product = self._product
        self.reset()
        return product

    def produce_part_a(self) -> None:
        self._product.add("发动机")

    def produce_part_b(self) -> None:
        self._product.add("车架")

    def produce_part_c(self) -> None:
        self._product.add("车身")


class Product1():
    """
    It makes sense to use the Builder pattern only when your products are quite
    complex and require extensive configuration.

    Unlike in other creational patterns, different concrete builders can produce
    unrelated products. In other words, results of various builders may not
    always follow the same interface.
    """

    def __init__(self) -> None:
        self.parts = []

    def add(self, part: Any) -> None:
        self.parts.append(part)

    def list_parts(self) -> None:
        print(f"产品部分为: {', '.join(self.parts)}", end="")


class Director:
    """
    The Director is only responsible for executing the building steps in a
    particular sequence. It is helpful when producing products according to a
    specific order or configuration. Strictly speaking, the Director class is
    optional, since the client can control builders directly.
    """

    def __init__(self) -> None:
        self._builder = None

    @property
    def builder(self) -> Builder:
        return self._builder

    @builder.setter
    def builder(self, builder: Builder) -> None:
        """
        The Director works with any builder instance that the client code passes
        to it. This way, the client code may alter the final type of the newly
        assembled product.
        """
        self._builder = builder

    """
    The Director can construct several product variations using the same
    building steps.
    """

    def build_minimal_viable_product(self) -> None:
        self.builder.produce_part_a()

    def build_full_featured_product(self) -> None:
        self.builder.produce_part_a()
        self.builder.produce_part_b()
        self.builder.produce_part_c()

  

main.py

调用:

       ## 生成器模式 Builder Pattern
        director = DuBuilder.Director()
        builder = DuBuilder.ConcreteBuilder1()
        director.builder = builder
        print("\n")
        print("生成器模式 Builder Pattern")

        print("产品最基本的部分: ")
        director.build_minimal_viable_product()
        builder.product.list_parts()

        print("\n")

        print("标准的全功能产品: ")
        director.build_full_featured_product()
        builder.product.list_parts()

        print("\n")

        # Remember, the Builder pattern can be used without a Director class.
        print("客户需要的产品部分: ")
        builder.produce_part_a()
        builder.produce_part_b()
        builder.product.list_parts()

  

输出:

生成器模式 Builder Pattern
产品最基本的部分: 
产品部分为: 发动机

标准的全功能产品: 
产品部分为: 发动机, 车架, 车身

客户需要的产品部分: 
产品部分为: 发动机, 车架
Process finished with exit code 0

  

 

 

标签:builder,product,Python,Pattern,Builder,None,self,def
From: https://www.cnblogs.com/geovindu/p/16807244.html

相关文章

  • python 可视化图表-折线图
    1.代码部分"""基础折线图"""#导包frompyecharts.chartsimportLine#创建一个折线图对象line=Line()#给折线图对象添加x轴的数据line.add_xaxis(["中国","......
  • python 嵌入式打包【保姆级文图教程】
    python嵌入式打包目录python嵌入式打包嵌入式解决了什么问题?什么是嵌入式?如何安装嵌入式?前往官网下载嵌入式解压并配置嵌入式设置如何安装新的模块如何运行嵌入式解......
  • python带你制作一个gequ下载器,海量gequ免费听
    前言大家早好、午好、晚好吖~  环境使用:Python3.8Pycharm安装python第三方模块:win+R输入cmd点击确定,输入安装命令pipinstall模块名(p......
  • python编程考试题目大全
    1.题目名称:批阅奏章某朝皇帝有大臣n名(1<=n<=1000),分别编号大臣1~n。某日皇帝身体抱恙,奏章堆积如山无法及时一一批阅,便命身旁內侍帮他把奏章按指定顺序排序后再阅。于是皇帝......
  • python自动化报告发送到邮件(qq邮箱)
      password为上方的授权码 smtpserver为(百度查一下对应邮箱smtp服务器是多少) username(用户名为发送方的邮箱)receiver(为接收人的邮箱)  importsmtplibf......
  • Day4:Python基础逻辑判断的优先顺序及不同数据类型间的转换
    1、逻辑判断优先级顺序优先级顺序,()>not>and>or#print(2>1and1<4)#print(2>1and1<4or2<3and9>6or2<4and3<2)#TorTorF#Tor......
  • 不怕新歌有多嗨,就怕老歌带DJ,用Python批量下载dj歌曲!
    俗话说,不怕新歌有多嗨,就怕老歌带dj,为了验证这句话,于是我直接找了个dj网,用Python把dj都下载下来,亲身体验一下!环境模块软件Python3.8pycharm2021 模块......
  • python+selenium环境搭建
    1、首先命令行进入到python安装目录的scripts目录下2、使用pip3installselenium,由于我是安装过的,所以会提示这个3、将谷歌浏览器的driver放到python安装目录下4、代码验证......
  • python语言:将多张图片压成一段视频——利用opencv-python库实现
     相关代码例子参见:​​All_finished_Demo.py​​   =========================================   这里将的功能就是用python语言实现将多张照片压成一段视频,使用的......
  • python编程中的circular import问题
    循环引入,circularimport是编程语言中常见的问题,在C语言中我们可以使用宏定义来处理,在c++语言中我们可以使用宏定义和类的预定义等方式来解决,那么在python编程中呢? 其实在p......