設計模式(建造者模式)

北京-IT拾荒者發表於2018-08-17

建造者模式

1、內容

將一個複雜物件的構建與它表示分離,使得同樣的構建過程可以建立不同的表示

2、角色

抽象建造者

具體建造者

指揮者

產品

建造者模式與抽象工廠模式相似,也用來建立複雜物件。主要區別是建造者模式著重一步步構造一個複雜物件,而抽象工廠模式著重於多個系列的產品物件。

3、優點

隱藏了一個產品的內部結構和裝配過程

將構造程式碼與表示程式碼分開

可以將構建過程進行更精細的控制

4、缺點

建造者模式所建立的產品一般具有較多的共同點,其組成部分相似;如果產品之間的差異性很大,則不適合使用建造者模式,因此其使用範圍受到一定的限制。

如果產品的內部變化複雜,可能會導致需要定義很多具體建造者類來實現這種變化,導致系統變得很龐大。

5、使用場景

當建立複雜物件的演算法(Director)應該獨立於該物件的組成部分以及它們的裝配方式(Builder)時

當構造過程允許被構造的物件有不同的表示時(不同Builder)

需要生成的產品物件有複雜的內部結構,這些產品物件具備共性;

隔離複雜物件的建立和使用,並使得相同的建立過程可以建立不同的產品。

6、程式碼示例

import random
from abc import abstractmethod, ABCMeta

#------產品------

class Player:
   def __init__(self, face=None, body=None, arm=None, leg=None):
       self.face = face
       self.arm = arm
       self.leg = leg
       self.body = body

   def __str__(self):
       return "%s, %s, %s, %s" % (self.face, self.arm, self.body, self.leg)


#------建造者------


class PlayerBuilder(metaclass=ABCMeta):
   @abstractmethod
   def build_face(self):
       pass
   @abstractmethod
   def build_arm(self):
       pass
   @abstractmethod
   def build_leg(self):
       pass
   @abstractmethod
   def build_body(self):
       pass
   @abstractmethod
   def get_player(self):
       pass


class BeautifulWomanBuilder(PlayerBuilder):
   def __init__(self):
       self.player = Player()
   def build_face(self):
       self.player.face = "漂亮臉蛋"
   def build_arm(self):
       self.player.arm="細胳膊"
   def build_body(self):
       self.player.body="細腰"
   def build_leg(self):
       self.player.leg="長腿"
   def get_player(self):
       return self.player

class RandomPlayerBuilder(PlayerBuilder):
   def __init__(self):
       self.player = Player()
   def build_face(self):
       self.player.face = random.choice(["瓜子臉","西瓜子臉"])
   def build_arm(self):
       self.player.arm=random.choice(["長胳膊","短胳膊"])
   def build_body(self):
       self.player.body=random.choice(["苗條","胖"])
   def build_leg(self):
       self.player.leg=random.choice(["長腿","短腿"])
   def get_player(self):
       return self.player

class PlayerDirector:
   def __init__(self, builder):
       self.builder = builder
   # 控制組裝順序
   def build_player(self):
       self.builder.build_body()
       self.builder.build_face()
       self.builder.build_arm()
       self.builder.build_leg()
       return self.builder.get_player()

pd = PlayerDirector(RandomPlayerBuilder())
p = pd.build_player()
print(p)
複製程式碼

設計模式(建造者模式)

識別圖中二維碼,領取python全套視訊資料

相關文章