建造者模式又被稱呼為生成器模式,這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。使用多個簡單的物件一步一步構建成乙個複雜的物件,有點像造房子一樣一步步從地基做起到萬丈高樓。注重的是new完物件之後的過程,而不是new 物件
1、定義:將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示建造者模式主要由幾部分組成:產品(product)建造者(builder)指揮者(director),以下面造電腦為例2、主要作用:在使用者不知道物件的建造過程和細節的情況下就可以直接建立複雜的物件。(指揮者的作用)
3、如何使用:使用者只需要給出指定複雜物件的型別和內容,建造者模式負責按順序建立複雜物件(把內部的建造過程和細節隱藏起來)
4、解決的問題:
(1)方便使用者建立複雜的物件(不需要知道實現過程)
(2)**復用性 & 封裝性(將物件構建過程和細節進行封裝 & 復用)
5、注意事項:與工廠模式的區別是:建造者模式更加關注與零件裝配的順序,一般用來建立更為複雜的物件
class
computer
對於不同價位的電腦來說,他們的cpu,gpu,memory都是不一樣的,但是他們都有這些特性。
如果我要組裝一台電腦,需要設定cpu,設定gpu,設定memory等等,因此我們需要乙個建造者來幫我們完成這類事情,首先定義乙個電腦建造者介面,介面的主要目的增加規範性,以及符合設計模式原則,介面定義了子類必須設定cpu,設定gpu,設定memory,並且返回組裝好的computer物件
inte***ce
computerbulider
接下來我們要開始造一台低配電腦,設定cpu,設定gpu,設定memory等等
class
lowcomputer
implements
computerbulider
@override
public
void
setgpu()
@override
public
void
setmemory()
@override
public computer bulid()
}
再比如造一台中配電腦
class
middlecomputer
implements
computerbulider
@override
public
void
setgpu()
@override
public
void
setmemory()
@override
public computer bulid()
}
現在建造者類已經寫完了,由於實現了computerbulider介面,所以擴充套件起來很方便
接下來我們想,關於怎麼設定cpu,設定gpu,設定memory的方法我們已經寫好了,但是呼叫這些方法的先後順序還沒有確定,所以我們要把這些先後順序封裝起來,使得使用者只要呼叫乙個方法就可以自動的設定cpu,設定gpu,設定memory,最後返回給使用者乙個組裝好的電腦。筆者在準備加入指揮者的時候,想到是否可以用之前的模板方法設計模式來完成。為此,需要更改computerbulider這個介面bulid方法,使其變成乙個預設方法,然後通過多型呼叫這個bulid方法也可以完成指揮者的功能。但事實上是行不通的,與其說行不通,也可以理解為條件很苛刻。
inte***ce
computerbulider
}
首先,介面類無法實現default方法,因為無法給予返回值,而且一旦這樣,computerbulider類既要承擔設定cpu等等的具體實現,還需要設定這些方法的執行流程,違反了類的單一原則。因此,我們需要加入構造者這個類,自動的呼叫這些流程
class
director
}
指揮者類有乙個靜態方法,使用者可以通過呼叫這個方法,從而很容易的得到乙個組裝好的computer電腦例項,如果我想要得到乙個低配電腦,那就可以computer computer = director.build(new lowcomputer());
得到,如果我想得到乙個中配電腦,那就可以computer computer = director.build(new middlecomputer());
得到,從而遮蔽了內部設定cpu、gpu這些流程,增加了**的封裝性,但是我們從這也可以看出,設定cpu、gpu這些流程的順序是固定了,無論是造乙個低配電腦,還是中配電腦,都是先設定cpu,然後設定gpu,再設定memory,當然,要修改其實也是可以的,那麼就需要判斷方法引數computerbulider是什麼型別的,針對不同的型別設定不同的順序
那麼從這來看,模板設計模式和指揮者都是為了遮蔽方法呼叫的流程,那麼他們之間又有什麼區別呢,在這裡我談談我的理解
首先,模板設計方式關於方法的呼叫流程是放在了父類,而子類可以通過設定一些方法來設定某個流程執不執行,比如isalarm方法,並且父類和子類直接沒有任何的成員變數傳遞,只是簡單的呼叫方法,同時,父類可以很容易的在run方法中設定具體方法的執行步驟,可以控制方法執行流程順序以及是否執行某個流程。如果我想要增加乙個子類並且控制子類方法是否執行,只需要在子類中重寫父類的鉤子函式,而不需要改變父類**
但是建造者設計模式就不一樣,在建造者設計模式中,指揮者和建造者直接並不是子父類的關係,在指揮者中,想要修改方法的呼叫順序比模板模式麻煩的多,如果新增乙個組裝高階電腦的類,想要控制它的順序,就必須在指揮者模式中增加**,違反開閉原則。
public
abstract
class
hummermodel
engineboom()
;stop()
;}// 鉤子函式
protected
boolean
isalarm()
}// 子類
public
class
hummercar1
extends
hummermodel
@override
protected
void
stop()
@override
protected
void
alarm()
@override
protected
void
engineboom()
@override
protected
boolean
isalarm()
}
設計模式 建造者模式
在gof的23種設計模式中對builder pattern的定義是 將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。從程式角度來說,就是在基類定義某種事物建立的過程或業務流程,在子類進行重寫或是使用基類方法。這樣建立出來的例項不會因為過程或流程的丟失而使業務失敗。舉例來說,...
設計模式建造者模式
今天看了乙個設計模式。總結下,以免忘了。如何引入建造者模式的呢?作者舉了個例子。建造小人。當然需要 頭,左手,右手,左腳,右腳,軀幹。建造的過程使用 使用類裡面的方法就行了。但是如果需要乙個胖的小人,乙個瘦的小人呢?就需要重新構造乙個胖人類,乙個瘦人類。當然 使用者還需要自己處理構造的過程。這樣 就...
設計模式 建造者模式
定義 將乙個複雜的物件的構建與它的表示分離,是的同樣的構建過程可以建立不同的表示。包括的要素 1 產品類 2 抽象建造者或者介面 3 建造者 4 導演類 建造者模式的優點 首先,建造者模式的封裝很好,使用建造者模式可以有效地封裝變化,注意在使用建造者模式的場景中,一般產品類和建造者介面是比較穩定的,...