代码成就万世基积沙镇海,梦想永在凌云意意气风发。

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()

 

posted @ 2017-12-10 17:34  Tomorrow1  阅读(125)  评论(0)    收藏  举报