Python设计模式-建造者模式
Python设计模式-建造者模式
代码基于3.5.2,代码如下;
1 #coding:utf-8 2 #建造者模式 3 class Burger(): 4 name = "" 5 price = 0.0 6 def getPrice(self): 7 return self.price 8 def setPrice(self,price): 9 self.price = price 10 def getName(self): 11 return self.name 12 13 class cheeseBurger(Burger): 14 def __init__(self): 15 self.name = "cheese burger" 16 self.price = 10.0 17 18 class spicyChickenBurger(Burger): 19 def __init__(self): 20 self.name = "spicy chicken burger" 21 self.price = 15.0 22 23 class Snack(): 24 name = "" 25 price = 0.0 26 type = "SNACK" 27 def getPrice(self): 28 return self.price 29 def setPrice(self,price): 30 self.price = price 31 def getName(self): 32 return self.name 33 34 class chips(Snack): 35 def __init__(self): 36 self.name = "chips" 37 self.price = 6.0 38 39 class chickenWings(Snack): 40 def __init__(self): 41 self.name = "chicken wings" 42 self.price = 12.0 43 44 45 class Beverage(): 46 name = "" 47 price = 0.0 48 type = "BEVERAGE" 49 50 def getPrice(self): 51 return self.price 52 53 def setPrice(self, price): 54 self.price = price 55 56 def getName(self): 57 return self.name 58 59 60 class coke(Beverage): 61 def __init__(self): 62 self.name = "coke" 63 self.price = 4.0 64 65 66 class milk(Beverage): 67 def __init__(self): 68 self.name = "milk" 69 self.price = 5.0 70 71 class order(): 72 burger = "" 73 snack = "" 74 beverage = "" 75 def __init__(self,orderBuilder): 76 self.burger = orderBuilder.bBurger 77 self.snack = orderBuilder.bSnack 78 self.beverage = orderBuilder.bBeverage 79 def show(self): 80 print("Burger:%s"%self.burger.getName()) 81 print("Snack:%s"%self.snack.getName()) 82 print("Beverage:%s"%self.beverage.getName()) 83 84 class orderBuilder(): 85 bBurger = "" 86 bSnack = "" 87 bBeverage = "" 88 def addBurger(self,xBurger): 89 self.bBurger = xBurger 90 91 def addSnack(self, xSnack): 92 self.bSnack = xSnack 93 94 def addBeverage(self, xBeverage): 95 self.bBeverage = xBeverage 96 97 def build(self): 98 return order(self) 99 100 if __name__ == "__main__": 101 order_builder = orderBuilder() 102 order_builder.addBurger(spicyChickenBurger()) 103 order_builder.addSnack(chips()) 104 order_builder.addBeverage(milk()) 105 order_builder.build().show()
建造者模式分析与解读
建造者模式
建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,作用是将"构建"和"表示"分离,以达到解耦的作用。
代码解读
该例子基于的需求:客户点餐系统。 1、先定义了Burger类,所有的主餐都是由该类继承而来(cheeseBurger,spicyChickenBurger),定义了Snack类,所有的小吃类都是由该类继承而来(chips,chickenWings),定义了Beverage类,所有的饮料都是由该类继承而来(coke,milk); 2、定义了order类,该类主要生成订单; 3、定义了orderBuilder订单建造者类,分别实现了添加主食addBurger、添加小吃addSnack和添加饮料addBeverage方法,当添加完成后调用build方法来生成订单,从而达到建造订单的目的。 代码运行结果如下: Burger:spicy chicken burger Snack:chips Beverage:milk
建造者模式应用场景:
1、目标对象由组件构成的场景中,适合建造者模式; 2、在具体场景中,对象内部接口需要根据不同的参数而调用顺序有所不同时,可以使用建造者模式。
优缺点分析
优点
1、封装性好,用户可以不知道对象的内部构造和细节,就可以直接建造对象; 2、系统扩展容易; 3、建造者模式易于使用,非常灵活,在构造性的场景中很容易实现"流水线"; 4、便于控制细节。
缺点
1、封装的过程对用户不透明。
备注
1 #建造者模式的通用代码 2 class product(): 3 def __init__(self): 4 self.partsList = [] 5 def add(self,part): 6 self.partsList.append(part) 7 def show(self): 8 for part in self.partsList: 9 print(part) 10 11 class builder(): 12 def buildPartA(self): 13 raise NotImplementedError 14 def buildPartB(self): 15 raise NotImplementedError 16 def getResult(self): 17 raise NotImplementedError 18 19 class ConcreteBuilder1(builder): 20 def __init__(self): 21 self.product = product() 22 def buildPartA(self): 23 self.product.add("1 A") 24 def buildPartB(self): 25 self.product.add("1 B") 26 def getResult(self): 27 self.product.show() 28 29 class ConcreteBuilder2(builder): 30 def __init__(self): 31 self.product = product() 32 def buildPartA(self): 33 self.product.add("2 A") 34 def buildPartB(self): 35 self.product.add("2 B") 36 def getResult(self): 37 self.product.show() 38 39 class director(): 40 def construct(self,builder): 41 builder.buildPartA() 42 builder.buildPartB() 43 if __name__ == "__main__": 44 de = director() 45 b1 = ConcreteBuilder1() 46 b2 = ConcreteBuilder2() 47 48 de.construct(b1) 49 b1.getResult() 50 de.construct(b2) 51 b2.getResult()
版权声明:本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
https://www.cnblogs.com/qq_841161825/

浙公网安备 33010602011771号