【Python设计模式】建造者模式

建造者模式是为了在编写代码的时候防止我们有些方法忘记实现,例如我们要绘制一个人的图形,我们需要绘制头、身体、手和脚,可能我们在绘制的时候忘记给这个人画手了,建造者模式就是为了防止这种情况的发生而设计的,这种关系有点像是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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值