什么是建造者模式,建造者模式例子
建造者模式(Builder Pattern):属于创作模式,提供了创建对象的最佳方式。这种模式使用多个简单的对象一步一步构建成一个复杂的对象,一个 Builder 类会一步一步构造最终的对象,且该 Builder类是独立于其他对象的。
意图:将一个复杂的构建从它的表示中分离出来,这样同一个构建过程可以创建不同的表示。
主要解决:主要解决在软件系统中,有时我们面临的是‘一个复杂对象’的创建,这个复杂对象通常是由各个部分的子对象用一定的算法组合而成;由于需求的变化,这个复杂对象的每个部分经常面临剧烈的变化,但是将它们组合在一起的算法是相对稳定的。
何时使用:时一些基本元件不会改变,但它们的组合会经常改变。
如何解决:将变化与未变化分开。
关键代码:构建器:创建并提供实例,Director:管理已构建实例的依赖关系。
优点:1.构建器是独立的,易于扩展。2.很容易控制细节的风险。
缺点:1.产品必须有共同点,范围有限。2.内部变化复杂的话,会有很多构造类。
注意事项:和工厂模式的区别在于,建造者模式更注重用零件装配的顺序。(根据以下例子,自己体会!)
应用实例:在我们的日常生活中,经常会遇到超市水果的限时促销,而这些促销的水果往往以便宜的价格吸引消费者的眼球,而我们的水果厂也迎来了夏季的季节性限时促销。
那我们一起使用建造者模式,实现一个促销水果的清单管理项目吧!()
实现的思路:
项目核心由四部分组成:MenuBuilder(推广列表的构建者)负责构建参与推广的水果列表,Menu(参与推广的水果列表)负责推广水果的管理功能,如添加、删除、查看等。Item(推广水果的通用模板类)负责提供水果基本信息的抽象类,如重量、原价、推广价、名称等。而Pack(包装类)负责管理水果。Grape(葡萄)、Citrus(橙子)、Tangerine(冰橙)和Hami_Melon(哈密瓜)是基于Item抽象类的具体实现。此外,它们都使用pack类中的Pack方法。项目的UML用例图如下:
实现的代码如下:
分类项目:#项目类提供水果的基础信息的抽象类定义集合名称(自身):传递定义包装(自身):传递定义集合价格(自身):传递定义集合重量(自身):传递定义促销价格(自身):传递类别包装:#包装管理水果的包装方式def Pack(self):pass class box _ Pack(Pack):# box-Pack采用盒装方式def pack(self): return 盒装类包_包(包):#包包采用袋装方式def pack(self): return 袋装葡萄类(物品):#葡萄类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哈密_甜瓜(项目):# 哈密瓜类极好的打包(self):wrap=bag _ pack()return wrap def set _ price(self):哈密_甜瓜_ price=22.0 return哈密_甜瓜_ price def set _ name(self):哈密_甜瓜_ name=哈密瓜返回哈密_甜瓜_ name def set _ weight(self):哈密_甜瓜_ weight=3.2返回哈密_甜瓜_ weight def promotion _ price(self):返回39.99类橙(项目):#橘子大类def packing(self):wrap=bag _ pack()return wrap def set _ price(self):passclass Citrus(Orange):#柑橘类def set _ price(self):citrus _ price=12.5 return citrus _ price def set _ name(self):citrus _ name=柑橘返回citrus _ name def set _ weight(self):citrus _ weight=2.6返回citrus _ weight def promotion _ price(self):返回18.88 class橘子(橙色):#冰橘类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类菜单:def _ _ init _ _(self):self。 items=[]def AddItem(self,item): #添加项目,即添加参与促销活动的水果自我。项目。追加(项目)定义显示项目(自身):#显示项目展示参与促销活动的水果清单打印(-*- * 5 限时促销清单-*- * 10)用于自我。项目:打印(项目:项目。set _ name()包装: item.packing().pack()原价: str( item.set_price())元/千克 重量: str(item.set_weight())千克\n限时促销价: str(item.promotion_price())元!)打印(-*- * 5 限时促销清单-*- * 10)类菜单生成器:@静态方法定义准备菜单():#构造清单,过程如下:menu=Menu()菜单AddItem(葡萄())菜单AddItem(柑橘())菜单AddItem(橘子())菜单. AddItem(Hami _ Melon())返回菜单if _ _ name _ _== _ _ main _ _ :#新建一个建造者menu_builder=MenuBuilder() #建造促销活动的水果清单菜单对象=菜单生成器PrepareMenu() #展示参与促销活动的水果信息菜单_对象。显示项目()相关的测试用例:
本文关于设计模式的讲解思想,参考链接:建造者模式
关于@staticmethod的用法,参考链接:@staticmethod和@classmethod的用法
往期推荐: 点这里-Python:水果与设计模式-单例模式
往期推荐: 点这里-Python:水果与设计模式-抽象工厂模式
往期推荐: 点这里-Python:水果与设计模式-工厂模式
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。