当我们想要创建一个由多个部分构成的对象,而且他们的构建需要一步接一步的地完成,只有当各个部分都创建好,这个对象才算完整。 -- 这正是 建造者设计模式的用武之地。
比如建造一个抽象的类Builder,定义画六个身体部位的方法,
每画一种人,就新建一个继承Builder的类,这样新建的类就必须要实现Builder的所以方法,这里主要运用了抽象方法的特性,
父类定义了几个抽象的方法,子类必须要实现这些方法,否则就报错,
这里解决了会漏画一个部位的问题。
建造一个指挥者类Director,输入一个Builder类,定义一个draw的方法,把画这六个部位的方法调用都放在里面,这样调用起来就不会繁琐了。
所以建造者模式用于将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
from abc import ABCMeta, abstractmethod
class Builder():
__metaclass__ = ABCMeta
@abstractmethod
def draw_left_arm(self):
pass
@abstractmethod
def draw_right_arm(self):
pass
@abstractmethod
def draw_left_foot(self):
pass
@abstractmethod
def draw_right_foot(self):
pass
@abstractmethod
def draw_head(self):
pass
@abstractmethod
def draw_body(self):
pass
class Thin(Builder):
def draw_left_arm(self):
print('画左手')
def draw_right_arm(self):
print('画右手')
def draw_left_foot(self):
print('画左脚')
def draw_right_foot(self):
print('画右脚')
def draw_head(self):
print('画头')
def draw_body(self):
print('画瘦身体')
class Fat(Builder):
def draw_left_arm(self):
print('画左手')
def draw_right_arm(self):
print('画右手')
def draw_left_foot(self):
print('画左脚')
def draw_right_foot(self):
print('画右脚')
def draw_head(self):
print('画头')
def draw_body(self):
print('画胖身体')
class Director():
def __init__(self, person):
self.person=person
def draw(self):
self.person.draw_left_arm()
self.person.draw_right_arm()
self.person.draw_left_foot()
self.person.draw_right_foot()
self.person.draw_head()
self.person.draw_body()
if __name__=='__main__':
thin=Thin()
fat=Fat()
director_thin=Director(thin)
director_thin.draw()
print("-"*30)
director_fat=Director(fat)
director_fat.draw()