python:水果与设计模式-建造者模式

建造者模式(Builder Pattern) :属于创建型模式,它提供了一种创建对象的最佳方式。这种模式 使用多个简单的对象一步一步构建成一个复杂的对象,一个 Builder 类会一步一步构造最终的对象,且该 Builder类是独立于其他对象的。

意图 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

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

何时使用 一些基本部件不会变,而其组合经常变化的时候。

如何解决 将变与不变分离开。

关键代码 建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。

优点 1、建造者独立,易扩展。 2、便于控制细节风险。

缺点 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。

注意事项 与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。(根据后面的实例,自行体会!!)

应用实例 我们在生活中常常会遇到超市的水果限时促销活动,而这些促销的水果常常以便宜的价格吸引消费者的注意力,而我们的水果工厂在夏季也迎来了换季限时促销活动。

python:水果与设计模式-建造者模式_第1张图片

那我们一起使用建造者模式,实现一个促销水果的清单管理项目吧!(づ。◕ᴗᴗ◕。)づ

实现的思路

  • 项目的核心包括4个部分:MenuBuilder(促销清单的建造者)负责建造参与促销的水果清单Menu(参与促销的水果清单)负责对促销水果的管理功能,如:增删改查等Item(促销水果的通用模板类)负责提供水果基础信息的抽象类,如:重量、原价、促销价、名称等,以及Pack(包装类)负责管理水果的包装方式。
  • Grape(葡萄)、Citrus(柑橘)、Tangerine(冰橘)、Hami_Melon(哈密瓜)是基于Item抽象类的具体实现,此外,他们均使用Pack类里面的pack方式

项目的UML用例图如下:

python:水果与设计模式-建造者模式_第2张图片

实现的代码如下:

class Item:
    # Item类提供水果的基础信息的抽象类
    def set_name(self):
        pass

    def packing(self):
        pass

    def set_price(self):
        pass

    def set_weight(self):
        pass

    def promotion_price(self):
        pass


class Pack:
    # Pack管理水果的包装方式
    def pack(self):
        pass


class box_pack(Pack):
    # box-pack采用盒装方式
    def pack(self):
        return "盒装"


class bag_pack(Pack):
    # bag-pack采用袋装方式
    def pack(self):
        return "袋装"


class Grape(Item):
    # 葡萄类
    def packing(self):
        wrap = box_pack()
        return wrap

    def set_price(self):
        grape_price = 18.0
        return grape_price

    def set_name(self):
        grape_name = "葡萄"
        return grape_name

    def set_weight(self):
        grape_weight = 2.5
        return grape_weight

    def promotion_price(self):
        return 28.99


class Hami_Melon(Item):
    # 哈密瓜类
    def packing(self):
        wrap = bag_pack()
        return wrap

    def set_price(self):
        hami_melon_price = 22.0
        return hami_melon_price

    def set_name(self):
        hami_melon_name = "哈密瓜"
        return hami_melon_name

    def set_weight(self):
        hami_melon_weight = 3.2
        return hami_melon_weight

    def promotion_price(self):
        return 39.99


class Orange(Item):
    # 橘子大类
    def packing(self):
        wrap = bag_pack()
        return wrap

    def set_price(self):
        pass


class Citrus(Orange):
    # 柑橘类
    def set_price(self):
        citrus_price = 12.5
        return citrus_price

    def set_name(self):
        citrus_name = "柑橘"
        return citrus_name

    def set_weight(self):
        citrus_weight = 2.6
        return citrus_weight

    def promotion_price(self):
        return 18.88


class Tangerine(Orange):
    # 冰橘类
    def set_price(self):
        tangerine_price = 13.0
        return tangerine_price

    def set_name(self):
        tangerine_name = "冰橘"
        return tangerine_name

    def set_weight(self):
        citrus_weight = 3.3
        return citrus_weight

    def promotion_price(self):
        return 26.66


class Menu:
    def __init__(self):
        self.items = []

    def AddItem(self, item):
        # 添加item,即添加参与促销活动的水果
        self.items.append(item)

    def ShowItems(self):
        # ShowItem,展示参与促销活动的水果清单
        print("-*-" * 5 + "限时促销清单" + "-*-" * 10)
        for item in self.items:
            print("◎Item:" + item.set_name() + " 包装:" + item.packing().pack() + " 原价:" + str(
                item.set_price()) + "元/千克" + " 重量:" + str(item.set_weight()) + "千克" + "\n        限时促销价:" +
                  str(item.promotion_price()) + "元!!!")
        print("-*-" * 5 + "限时促销清单" + "-*-" * 10)


class MenuBuilder:
    @staticmethod
    def PrepareMenu():
        # 构造清单,过程如下:
        menu = Menu()
        menu.AddItem(Grape())
        menu.AddItem(Citrus())
        menu.AddItem(Tangerine())
        menu.AddItem(Hami_Melon())
        return menu


if __name__ == '__main__':
    # 新建一个建造者
    menu_builder = MenuBuilder()
    # 建造促销活动的水果清单
    menu_object = menu_builder.PrepareMenu()
    # 展示参与促销活动的水果信息
    menu_object.ShowItems()

相关的测试用例:

python:水果与设计模式-建造者模式_第3张图片

本文关于设计模式的讲解思想,参考链接:建造者模式

关于@staticmethod的用法,参考链接:@staticmethod和@classmethod的用法

往期推荐: 点这里->Python:水果与设计模式-单例模式

往期推荐: 点这里->Python:水果与设计模式-抽象工厂模式

往期推荐: 点这里->Python:水果与设计模式-工厂模式

你可能感兴趣的:(python,python:水果与设计模式,设计模式,建造者模式,python)