首页 > 编程语言 >Python实现软件设计模式4:建造者模式

Python实现软件设计模式4:建造者模式

时间:2023-12-17 11:11:26浏览次数:36  
标签:__ mb Python self 模式 软件设计 food 套餐 def

特点

  • 建造者模式是一步一步构建一个复杂的对象,属于对象创建型模式
  • 将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示
  • 关注如何逐步地创建一个复杂的对象或产品,不同的创造者定义了不同的创建过程
  • 用户不需要知道内部的具体构造细节、只用指定复杂对象的类型(建造者类型)

角色组成

  • Builder 抽象建造者
  • ConcreteBuilder 具体建造者
  • Director 指挥者
  • Product 复杂的一套产品

模式实例

  • KFC套餐是一个复杂对象,他一般包含主食(汉堡或鸡肉卷)和饮料(可乐或果汁)等组成部分,不同的套餐有不同的组成部分
  • 服务员可根据顾客的要求一步一步装配这些组成部分,构造一分完整的套餐,然后返回给顾客

代码实现

from abc import ABC, abstractmethod

class Meal: # 套餐类
    def __init__(self, food = None, drink = None):
        self.fd = food
        self.dk = drink 

    @property
    def food(self):
        return self.fd
    
    @food.setter
    def food(self, fdname):
        self.fd = fdname

    @property
    def drink(self):
        return self.dk
    
    @drink.setter
    def drink(self, dkname):
        self.dk = dkname

class MealBuilder:  # 套餐创建者 
    def __init__(self):
        self._meal = Meal()  # 初始化套餐

    @abstractmethod
    def buildFood(self):    # 构造套餐组成1:food
        pass

    @abstractmethod
    def buildDrink(self):   # 构造套餐组成2:drink
        pass

    def getMeal(self):  # 返回完整的套餐对象
        return self._meal

class PlanA(MealBuilder):   # 具体套餐A
    def buildFood(self):
        self._meal.food = "一个鸡腿堡"
    
    def buildDrink(self):
        self._meal.drink = "一杯可乐"

class PlanB(MealBuilder):   # 具体套餐B
    def buildFood(self):
        self._meal.food = "一个鸡肉卷"
    
    def buildDrink(self):
        self._meal.drink = "一杯果汁"

class KFCWaiter:    # 指挥者  
    def __init__(self):
        self.mb = MealBuilder() # 包含一个抽象的套餐建造者
    
    def setMealBuilder(self, mb):   # 注入一个具体的套餐建造者对象
        self.mb = mb
    
    def construct(self):        # 注意构造顺序
        self.mb.buildFood()     # 构造子部件1
        self.mb.buildDrink()    # 构造子部件2
        return self.mb.getMeal() # 返回完整的套餐对象

class Client:
    def __init__(self, taocan : str):
        self.mealbuilder = taocan
        
    def run(self):
        try:
            mb = eval(self.mealbuilder)()
            waiter = KFCWaiter()
            waiter.setMealBuilder(mb)   # 本质上由mb决定选择的套餐
            meal = waiter.construct()
            print(" 套餐组成:")
            print(meal.food)
            print(meal.drink)
        except:
            print(f"套餐{self.mealbuilder}不存在!!")

if __name__ == '__main__':
    bob = Client('PlanA')
    bob.run()
    
    print("-"*20)

    David = Client('PlanB')
    David.run()

总结

  • 客户端不必知道复杂产品的内部组成细节,产品本身与产品创建过程解耦
  • 每一个具体建造者相对独立(分别定义为一个个的ConcreteBuilder类),扩展新的具体建造者很方便,符合开闭原则
  • 对象的创建过程独立于创建该对象的类;将某个复杂对象的创建过程封装在指挥者类中,而不在建造者类和客户类中
  • 适用场景:创建的复杂产品需要有共同点、组成成分相似(如汽车对象主要包含:方向盘+车架+轮胎+发动机)

标签:__,mb,Python,self,模式,软件设计,food,套餐,def
From: https://www.cnblogs.com/Higgerw/p/17908871.html

相关文章

  • Python实现软件设计模式3:抽象工厂模式
    特点系统中除了有多种产品类型(产品等级结构,如果汁、方便面、矿泉水),还出现了多个品牌(产品族,或农夫山泉、娃哈哈、康师傅、统一等品牌几乎都有这些产品)在工厂方法模式中,只有一个产品等级结构一个抽象产品(父类)、多个具体产品(子类)形成一个产品等级结构产品族是指由同一个工厂生产......
  • python 使用 Google Gemini API
    python使用GoogleGeminiAPI注册APIKEY:GoogleAIStudio[免费]importbase64importrequestsimportjsonAPI_KEY='yourapikey'img_path='./scones.jpg'#设置模型参数和过滤规则https://ai.google.dev/api/rest/v1beta/SafetySetting?hl=zh-cn#H......
  • Python NumPy 与 Pandas 结合使用
    1、NumPy数组与PandasDataFrame/Series转换NumPy数组与PandasDataFrame/Series是Python中常用的两种数据结构,它们都用于存储和处理数据。NumPy数组是一种多维数组,它可以存储一维、二维、三维或更高维的数据。NumPy数组的优点是速度快、效率高,适合用于数值计算。Panda......
  • python之tkinter的button控件
    按钮组件,用于监听用户行为,调用具体功能函数。按钮上可以是文字或者图片。语法:Button(master,option……)master父容器option参数参数:参数属性举例或备注bg按钮背景颜色 fg按钮前景颜色按钮上的文字颜色bd按钮边框大小边框会呈现立体感activebackground鼠标点击时按钮背景色 act......
  • 面试Python时必会的知识点总结
    目前代码技能已经成了测试同学面试考核的刚需,对于测试开发来讲需求最大的是java和python两门语言,二者也都是面向对象语言。对于刚入门代码的同学来说面向对象相关的概念比较难于理解,而面向对象编程相关的知识点偏偏又是面试中的高频问题,所以本文我以python为例,带大家快速搞定面向......
  • python 基础极简解释
    python基础局部与全局声明全局变量global数据存储列表变量=[数据1,数据2]变量[索引]基本:方法说明列表名.index(值)输入列表值取索引列表名[索引]=数据赋值lea(列表)统计元素列表.count(数据)统计数据出现的次数排序:方法说明列表......
  • Python中级之解压赋值
    解压赋值【一】解压赋值的概念解压赋值是指将一个可迭代对象(如列表、元组、字典的键值对等)中的元素拆分并分配给多个变量。这种技术非常方便,可以简洁地从一个数据结构中提取元素并将它们分配给多个变量。需要确保变量的数量与可迭代对象中的元素数量匹配,否则会引发ValueError......
  • Python装饰器:深入探索功能增强的神奇工具(特点+应用+举例)
    Python装饰器是一项强大的特性,它允许程序员在不改变函数或类本身的情况下,增加、扩展或修改它们的行为。从日志记录到权限验证,再到性能分析和缓存,装饰器在Python编程中发挥着重要的作用。本文将深入探讨装饰器的各个方面,从基本概念到实际应用,带您领略装饰器的神奇之处。装饰器是Pyth......
  • python高级之生成器
    生成器一、生成器与yield若函数体包含yield关键字,再调用函数,并不会执行函数体代码,得到的返回值即生成器对象defmy_range(start,stop,step=1):print('start...')whilestart<stop:yieldstartstart+=stepprint('end...')g=my_range(0,3)......
  • 设计模式概念和分类
    (设计模式概念和分类)概念设计模式一般是指软件开发人员在开发的时候遇到软件设计问题时的一般解决方案,这样当我们遇到重复问题的时候,就能够一次一次地使用该方案而避免了重复劳动。并且可以提高代码的可重用性和可读性,增强系统的可靠性和可维护性,解决一系列的复杂问题,提高协作效......