一、
問題:在軟體系統中,有時候面臨著「乙個複雜物件」的建立工作,其通常由各個部分的子物件用一定的演算法構成。由於需求的變化,這個複雜物件的各個部分經常面臨著劇烈的變化,但是將它們組合在一起的演算法卻相對穩定。
這個描述和模板方法模式很相似,但是這個模式主要解決建立工作。
比如建立房子,步驟是一樣的,但是每個步驟的具體實現時不一樣的。
我們可以將物件的表示與建立部分相分離,使其可以用相同的建立步驟來描述不同的表示。
二、像當初寫android時,經常使用的方法那樣。
問題:當乙個類有很多引數需要配置,有些是必須的,有些是可選的。那麼有幾種做法:
做法一:將必須賦值的引數放入類的建構函式中,其他可選的引數提供setting/getting方法。
這樣做的缺點是,當可選的引數很多時,實使用起來需要呼叫很多setting方法。那麼有可能還沒setting完,這個不完整的物件就被獲得使用了。
做法二:重建很多建構函式,使用者根據需要配置的引數選擇不同的建構函式。
這樣做的缺點是,建構函式會特別多,是可選引數個數的組合。
做法三:構建器模式,將類a引數的配置(也就是物件的構建)提取成乙個類abuilder ,這個類abuilder 一般是內部類。
1. 在這個內部類abuilder 中寫setting方法用來配置可選引數,並為所有的setting方法返回本物件a。
2. abuilder 中有乙個builder方法,就是呼叫a的構造方法,返回乙個a的物件。
3. a的構造方法為私有方法,只能通過這個內部類呼叫,該方法有引數abuilder ,在該構造方法中,將a的字段值完全賦值給a,並返回a物件。
4. a與abuilder 的字段完全相同
5. abuilder 的建構函式應該包含所有必選的引數。
6. abuilder必須宣告為public static class abuilder{}因為使用的時候是通過a的類名呼叫abuilder的建構函式的。
具體**:
class a//必選引數
public settingage(int age){
this.age=age;
public a builder(){
return new a(this);
使用:a a = a.abuilder("張三").settingage(20).builder();
總結,這兩種方法都是將構建部分提取成乙個類,只是乙個是一般類,類中固有原類的物件,通過這個物件來配置成員變數。乙個是內部類,這個內部類有和原類一樣的成員變數,在最後返回類時,將自己的變數值賦給原類。
另外:如果乙個方法是乙個流程的單個步驟,對外部來說沒什麼意義,則不要將其宣告為public。
設計模式學習3 Builder Pattern
在軟體系統中,有時面臨著 乙個複雜物件的建立 的工作,通常是由各個部分的是使用一定的演算法來過程的。由於需求的變化 各個部分在變化 每個部分經常面臨巨大的變化,但是將他們組合在一起的演算法確實相對穩定的。同樣的構建過程可以建立不同的表示。inte ces 這裡是相當於能夠提供的服務,客戶端只需要使用...
寫在11月11日
寫在 11 月 11 日 11 月 11 日 是乙個很平常也很特殊的日子,沒有什麼紀念,只是覺得今天應該是個不一般的時候,看著那有著大大螢光螢幕的電子鐘,看著乙個個孑然而立的小寫羅馬數字,是那麼的昂然磅礴,有著不屑於一切氣勢。其實,在今天早上睜開眼睛的時候,就想到了,11 月 11 日 這個很有意思...
SQL中1 1與1 1的使用
1.1 1 的用處 用於只取結構不取資料的場合 例如 create table table temp tablespace tbs temp as select from table ori where 1 1 建成乙個與table ori 結構相同的表table temp,但是不要table or...