建造者模式是为了在编写代码的时候防止我们有些方法忘记实现,例如我们要绘制一个人的图形,我们需要绘制头、身体、手和脚,可能我们在绘制的时候忘记给这个人画手了,建造者模式就是为了防止这种情况的发生而设计的,这种关系有点像是java中的接口类,子类必须实现接口中定义的所有方法,不然就会报错,通过这种方法,所有实现画人的类都必须实现画人的接口类中的方法,不会遗漏任何一个方法。
这里参考了《大话设计模式》中的例子
from abc import abstractmethod, ABC
'''画图类'''
class Pen:
def draw_head(self, size):
print('画'+size+'大小的头')
def draw_body(self, size):
print('画'+size+'大小的身体')
def draw_arms(self, size):
print('画'+size+'大小的手')
def draw_legs(self, size):
print('画'+size+'大小的腿')
'''建造者抽象类'''
class PersonBuilder(ABC):
@abstractmethod
def build_head(self):
pass
@abstractmethod
def build_body(self):
pass
@abstractmethod
def build_arms(self):
pass
@abstractmethod
def build_legs(self):
pass
'''画一个瘦子'''
class PersonThinBuilder(PersonBuilder):
def __init__(self, pen):
self.p = pen
def build_head(self):
self.p.draw_head('10')
def build_body(self):
self.p.draw_body('10')
def build_arms(self):
self.p.draw_arms('10')
def build_legs(self):
self.p.draw_legs('10')
'''指挥者,控制建造过程'''
class PersonDirector:
def __init__(self, pb):
self.pb = pb
def create_person(self):
self.pb.build_head()
self.pb.build_body()
self.pb.build_arms()
self.pb.build_legs()
if __name__ == '__main__':
pen = Pen()
pb = PersonThinBuilder(pen)
person = PersonDirector(pb)
person.create_person()
这里通过创建一个PersonDirector
的类用来管理创建过程,上面给出了画一个瘦子的例子,如果我们想要画一个胖子怎么办,这个时候我们可以创建一个画胖子的类PersonFatBuilder
,然后将其作为参数传递给PersonDirector
类,即可以画出一个胖子,在这个过程中我们没有修改原来的代码,符合软件设计过程中的开闭原则。
from abc import abstractmethod, ABC
'''画图类'''
class Pen:
def draw_head(self, size):
print('画'+size+'大小的头')
def draw_body(self, size):
print('画'+size+'大小的身体')
def draw_arms(self, size):
print('画'+size+'大小的手')
def draw_legs(self, size):
print('画'+size+'大小的腿')
'''建造者抽象类'''
class PersonBuilder(ABC):
@abstractmethod
def build_head(self):
pass
@abstractmethod
def build_body(self):
pass
@abstractmethod
def build_arms(self):
pass
@abstractmethod
def build_legs(self):
pass
'''画一个瘦子'''
class PersonThinBuilder(PersonBuilder):
def __init__(self, pen):
self.p = pen
def build_head(self):
self.p.draw_head('10')
def build_body(self):
self.p.draw_body('10')
def build_arms(self):
self.p.draw_arms('10')
def build_legs(self):
self.p.draw_legs('10')
'''画一个胖子'''
class PersonFatBuilder(PersonBuilder):
def __init__(self, pen):
self.p = pen
def build_head(self):
self.p.draw_head('20')
def build_body(self):
self.p.draw_body('20')
def build_arms(self):
self.p.draw_arms('20')
def build_legs(self):
self.p.draw_legs('20')
'''指挥者,控制建造过程'''
class PersonDirector:
def __init__(self, pb):
self.pb = pb
def create_person(self):
self.pb.build_head()
self.pb.build_body()
self.pb.build_arms()
self.pb.build_legs()
if __name__ == '__main__':
pen = Pen()
pb = PersonThinBuilder(pen)
person = PersonDirector(pb)
person.create_person()
pb2 = PersonFatBuilder(pen)
person2 = PersonDirector(pb2)
person2.create_person()