【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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章