[Python设计模式] 第13章 造小人——建造者模式

github地址:https://github.com/cheesezh/python_design_patterns

题目1

用程序模拟一个画小人的过程,要求小人要有头,身子,左手,右手,左脚,右脚。

基础代码

class PersonDrawer():
    
    def draw(self):
        print("画头")
        print("画身子")
        print("画左手")
        print("画右手")
        print("画左脚")
        print("画右脚")
        
def main():
    drawer = PersonDrawer()
    drawer.draw()
    
main()
画头
画身子
画左手
画右手
画左脚
画右脚

题目2

再画一个身子胖一些的小人。

class FatPersonDrawer():
    
    def draw(self):
        print("画头")
        print("画身子(胖一些)")
        print("画左手")
        print("画右手")
        print("画右脚")
        
def main():
    drawer = FatPersonDrawer()
    drawer.draw()
    
main()
画头
画身子(胖一些)
画左手
画右手
画右脚

点评

画胖一些的小人时候,稍不注意,漏掉了左脚。画小人的步骤很繁琐,稍不注意就会漏掉一步,导致小人缺胳膊少腿。最好的办法就是规定,建造小人的时候,必须要有头,身子,左手,右手,左脚,右脚。这时候就可以使用建造这模式。

建造者模式

建造小人的过程是稳定的,都需要头身手脚,但是具体建造的细节是不同的,高矮胖瘦都有。

为了将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,就可以使用建造者模式,又叫“生成器模式”。

实现的方法就是定义抽象的建造者类,通过抽象函数的方法把构建的过程固定下来,这样就每一步也不能少,不会出现缺胳膊少腿的情况了。

from abc import ABCMeta, abstractmethod


class PersonBuilder():
    """
    抽象建造者,定义创建对象各个部件的接口
    """
    __metaclass__ = ABCMeta
    
    @abstractmethod
    def draw_head(self):
        pass
    
    @abstractmethod
    def draw_body(self):
        pass
    
    @abstractmethod
    def draw_left_arm(self):
        pass
    
    @abstractmethod
    def draw_right_arm(self):
        pass
    
    @abstractmethod
    def draw_left_leg(self):
        pass
    
    @abstractmethod
    def draw_right_leg(self):
        pass

    
class ThinPersonBuilder(PersonBuilder):
    """
    具体建造者,实现创建各个部件的接口
    """
    def draw_head(self):
        print("画头——瘦小人")
    
    def draw_body(self):
        print("画身子——瘦小人")
    
    def draw_left_arm(self):
        print("画左手——瘦小人")
        
    def draw_right_arm(self):
        print("画右手——瘦小人")
        
    def draw_left_leg(self):
        print("画左腿——瘦小人")
    
    def draw_rihgt_leg(self):
        print("画右腿——瘦小人")
        

class FatPersonBuilder(PersonBuilder):
    """
    具体建造者,实现创建各个部件的接口
    """
    def draw_head(self):
        print("画头——胖小人")
    
    def draw_body(self):
        print("画身子——胖小人")
    
    def draw_left_arm(self):
        print("画左手——胖小人")
        
    def draw_right_arm(self):
        print("画右手——胖小人")
        
    def draw_left_leg(self):
        print("画左腿——胖小人")
    
    def draw_rihgt_leg(self):
        print("画右腿——胖小人")
        
        
class PersonDirector():
    """
    指挥者,是构建一个使用Builder接口的对象
    """
    def __init__(self, person_builder):
        self.person_builder = person_builder
        
    def create_person(self):
        self.person_builder.draw_head()
        self.person_builder.draw_body()
        self.person_builder.draw_left_arm()
        self.person_builder.draw_right_arm()
        self.person_builder.draw_left_leg()
        self.person_builder.draw_right_leg()
        
def main():
    
    thin_person_builder = ThinPersonBuilder()
    thin_person_director = PersonDirector(thin_person_builder)
    thin_person_director.create_person()
    
    fat_person_builder = FatPersonBuilder()
    fat_person_director = PersonDirector(fat_person_builder)
    fat_person_director.create_person()
    
main()
画头——瘦小人
画身子——瘦小人
画左手——瘦小人
画右手——瘦小人
画左腿——瘦小人
画头——胖小人
画身子——胖小人
画左手——胖小人
画右手——胖小人
画左腿——胖小人

点评

建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以需要改变一个产品的内部表示,只需要再定义一个具体的建造者即可。

建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。

posted @ 2018-08-06 17:09  ZH奶酪  阅读(763)  评论(0编辑  收藏  举报