前兩個文章我介紹了工廠方法模式和抽象工廠模式,這次我來講一些生成器模式。生成器模式我也用的比較多。5個建立型模式裡面,我比較喜歡用工廠方法模式,生成器模式和單例模式。
意圖將乙個複雜物件的構建與它的表示分開,使得同樣的構建過程可以建立不同的表示。
結構圖
一眼看去是不是和抽象工廠模式有點像?是啊,我也覺得很像,有什麼分別呢?別急,讓我先講一下builder 模式是怎麼實現的。
為了更好的來解釋生成器模式,我這裡還畫了個序列圖,這個序列圖清楚地描述了客戶端是如何來使用生成器的。
產品類,沒有變化,直接給出**:
class ccomponent
;class cterrain
m_background = bg;
} virtual void setground(ccomponent* ground)
m_ground = ground;
} cterrain()
virtual ~cterrain()
if (m_ground)
}protected:
ccomponent* m_background;
ccomponent* m_ground;
};class csnowbackground: public ccomponent
};class csnowground: public ccomponent
};
然後是關鍵的builder類,首先我們抽象乙個cbuilder類:
class cbuilder
;
裡面有3個介面:
1. 建立乙個背景例項,構建cterrain物件的背景;
2. 建立乙個地面例項,構建cterrain物件的地面;
3. 返回乙個cterrain例項(terrain由背景和地面組成)
注意這3個函式裡面,只有第三個函式才返回乙個cterrain例項,另外2個函式都不返回任何東西。
接下來讓我們看看cbuilder的乙個具體實現子類:
class csnowterrainbuilder: public cbuilder
virtual void makeground()
virtual cterrain* getterrain()
csnowterrainbuilder()
protected:
cterrain* _terrain;
};
從**裡面可以看到,我們在csnowterrainbuilder裡面增加了乙個cterrain*的資料成員。也就是說csnowterrainbuilder聚合了乙個cterrain物件。
makebackground()和makeground()生成了2個cterrain的元件,並且把生成的元件放到cterrain物件裡面(也就是構建cterrain物件)。
下面我們來看一下ccreator類(也就是builder模式裡面的director)
class ccreator
};
這個函式跟抽象工廠裡面的那個函式很像,但是我們可以發現,抽象工廠ccreator::create()裡面的其中4行**在生成器模式裡面並沒有:
class ccreator
};
哈哈,看一下csnowterrainbuilder的**就明白了,原來這些**跑到csnowterrainbuilder裡面去了。也也就是生成器模式的乙個特點,把物件的構建給分離出去了(這些構建**跑到builder類裡面去了)。
然後再看一下生成器模式的ccreator::create(),我們會發現ccreator並不知道cterrain的內部表示(makebackground和makeground並沒有返回任何東西)。從介面名字也許可以知道builder在建立背景和地面例項,但是並不知道具體在建立什麼例項。從類圖的角度講生成器模式的director(ccreator)類並不依賴於背景類和地面類。而抽象工廠模式卻是依賴的。用g4的說法就是:生成器隱藏了物件cterrain的內部表示。這就使得改變cterrain的內部表示要容易一些,因為所有cbuilder的客戶都不需要被改變。
最後看看客戶端是怎麼呼叫的:
csnowterrainbuilder builder;
ccreator creator;
creator.create(builder);
cterrain* snowterrain = builder.getterrain();//snowterrain 就是builder建立出來的地形例項
//這裡可以用snowterrain來做一些其他的事情
delete snowterrain;
相當的easy。
假如要build乙個新的地形,比如森林地形,很簡單,增加乙個cbuilder的子類:cforestterrainbuilder,然後在客戶端裡面建立乙個cforestterrainbuilder的物件,傳給ccreator就ok了。
好了,生成器模式基本介紹完畢。文章的開始我們就講了生成器模式和抽象工廠模式很像。那麼到底有什麼分別呢?
我們可以總計一下:
1. 抽象工廠模式的工廠類提供了一系列建立物件的介面,這些介面裡面僅僅建立物件,而沒有任何構建的動作。而生成器模式的builder類裡面提供的介面實現了物件的構建。
2. 抽象工廠模式的工廠類的每乙個介面都返回乙個物件。而生成器模式的builder類的介面裡面,只有乙個函式返回最後構建完畢的物件,其他所有的介面並不返回任何東西。
3. 生成器模式著重於一步一步構造乙個複雜物件。而抽象工廠模式著重於多個系列的產品物件(簡單或者複雜的)。
4. 生成器模式在最後一步才返回產品,而抽象工廠模式是立即返回。
我個人的習慣就是當乙個物件比較複雜的時候,比如這個物件有很多其他物件組成,然後這些組成相對比較容易會變動時,用builder模式比較合適。
設計模式 生成器模式
封裝乙個產品的構造過程,並允許按步驟構造 需要經過多個步驟建立的物件,如實際生活中的點餐流程,管理系統中的匯出框架等 此處以點餐流程為例 入口 package com.glt.designpattern.builder public class initmain 建造者類 package com.g...
設計模式 生成器模式
定義 將乙個複雜的物件,分成多分,使同樣的構建過程,能有不同的表示,這樣的設計模式被稱為建造者模式。舉例說明 李嘉誠的遺囑執行 財產 產品角色 李嘉誠擁有眾多複雜的財產框架,這裡以現金與物品入例。遺囑 建造者 相當於建造者,分配現金與物品。具體遺囑 具體建造者 1.給大兒子的財產分配,2,給小兒子的...
設計模式之 生成器模式
在產品結構比較複雜,構造過程比較繁瑣,一次性構造比較難的時候,我們可以採取分而治之的原則,將產品元件化,每個元件由專門的廠商來生產,最後的產品指派給制定的車間進行最後裝配.這種方式其實是現代製造業的一種典型的模式.比如汽車,飛機的製造等.這樣做的好處是 1.產品的部件由專門的生產廠商來生產,這樣分工...