天天看點

23設計模式-建造者模式(建立型模式)建造者模式

建造者模式

建造者模式将圍繞着一個修建房子的需求簡介
  1. 需要修建一個房子,修房子過程有打樁、砌牆、封頂
  2. 房子有各種各樣,比如普通民房,高樓,别墅等各種房子雖然修建一樣,但是要求不一樣

傳統方式解決蓋房需求

首先編寫一個AbstractHouse抽象類類,其中包含了3個抽象方法打樁,砌牆,封頂,子類通過繼承父類,實作父類方法來修建不同要求的樓房
23設計模式-建造者模式(建立型模式)建造者模式

AbstractHouse

AbstractHouse抽象類,裡面寫着3個抽象方法需要子類去實作的
23設計模式-建造者模式(建立型模式)建造者模式

CommonHouse

普通民房,繼承AbstractHouse重寫重寫方法編寫自己特點的業務
23設計模式-建造者模式(建立型模式)建造者模式

Client

Client隻需按不同情況new自己需要修建的類型的房子調用build方法即可
23設計模式-建造者模式(建立型模式)建造者模式

傳統方式問題分析

  1. 優點:比較好了解,簡單易操作
  2. 缺點:設計的程式結構,過于簡單,沒有設計緩存層對象,程式擴充和維護不好,這種設計方案,把産品(房子)和建造産品的過程(建房流程)封裝在一起,耦合性增強
  3. 解決方案:将産品和産品建造過程解耦 => 建造者模式

建造者模式

基本介紹

  1. 建造者模式(Builder Pattern)又叫生成器模式,是一種對象構模組化式,它可以将複雜對象的建造過程抽象出來(抽象類),使這個抽象過程的不同實作方法可以構造不同表現(屬性)的對象
  2. 建造者模式是一步一步建立一個複雜的對象,它允許使用者隻通過指定複雜對象的類型和内容就可以建構它們,使用者不需要知内部的具體建構細節

建造者模式四個角色

  1. Product(産品角色):一個具體的産品對象
  2. Builder(抽象建造者):建立Product(産品),并且制定組合産品的流程和步驟(接口/抽象類)
  3. ConcreteBuilder(具體建造者):實作Builder中制定的流程和步驟(接口),建構和裝配各個部件
  4. Director(指揮者):建構一個使用Builder接口的對象,它主要是用于建立一個複雜的對象,它主要作用是隔離客戶與對象生産過程,負責控制産品對象的生産過程
23設計模式-建造者模式(建立型模式)建造者模式

建造者模式解決蓋房需求

House(Product):産品角色,裡面這個房子的組成部分,包括地基,砌牆,屋頂屬性

HouseBuilder(Builder):抽象的建造者,裡面建立了House對象,并且定義了建造房子所需要實作的方法和擷取House對象的方法

CommonHouse/HighBuilding(ConcreteBuilder):具體建造者,繼承HouseBuilder實作每一個建造步驟的具體的建造内容

HouseDirector(Director):指揮者,建構一個HouseBuilder對象,constructHouse方法中制定整個House的建造流程

23設計模式-建造者模式(建立型模式)建造者模式

House

定義一個房子(産品)是由什麼組成的
23設計模式-建造者模式(建立型模式)建造者模式

HouseBuilder

抽象建造者,編寫房子(産品)被修建時需要實作的方法
23設計模式-建造者模式(建立型模式)建造者模式

CommonHouse

繼承(HouseBuilder)抽象建造者,實作抽象建造者制定的抽象方法
23設計模式-建造者模式(建立型模式)建造者模式

HouseDirector

定義一個HouseBuilder(抽象建造者),通過構造器/setter方式傳入得到相應具體建造者,constructHouse方法指揮整個房子(産品)的建造并且最後傳回建造好的産品
23設計模式-建造者模式(建立型模式)建造者模式

Client

建立想要修建的房子類型CommonHouse,建立指揮者HouseDirector并且傳入需要修建的房子類型,調用houseDirector.constructHouse();方法得到建造好的産品

子類型CommonHouse,建立指揮者HouseDirector并且傳入需要修建的房子類型,調用houseDirector.constructHouse();方法得到建造好的産品

23設計模式-建造者模式(建立型模式)建造者模式

建造者模式的注意事項和細節

  1. 用戶端不必知道産品内部組成細節,将産品本身與産品的建立過程解耦,使得相同的建立過程可以建立不同的産品對象
  2. 每一個具體建造者相對獨立,而與其它的具體建造者無關,是以可以很友善的替換或者增加新的建造者,使用者使用不同的具體建造者即可建造不同的産品對象
  3. 可以更加精細的控制産品的建立過程,将複雜産品和建立步驟分解在不同的方法中,使得建立過程更加清晰,也更友善使用程式來控制建立過程
  4. 增加新的具體建造者無須修改原有類庫的代碼,指揮者類針對抽象建造者類程式設計,系統擴充友善,符合“開閉原則”
  5. 建造者模式所建立的産品一般具有較多的共同點,其組成部分相似,

    如果産品之間的差異性很大,則不适合使用建造者模式

    ,是以使用範圍有一定限制
  6. 如果産品的内部變化複雜,可能會導緻需要定義很多具體建造者類實作這些變化,導緻系統變得龐大,是以在這種情況下要考慮是否選擇建造者模式

抽象工廠模式與建造者模式比較

抽象工廠模式實作對産品家族的建立,一個産品家族是這一系列産品,具有不同分類次元的産品組成,采用抽象工廠模式不需要關心建構過程,隻關心什麼産品由什麼工廠生産即可,而建造者模式是要求按照制定的藍圖建造産品,它的主要目的是通過組裝零配件而生産一個新産品