設計模式 生成器模式

2021-06-10 10:43:49 字數 3166 閱讀 6376

前兩個文章我介紹了工廠方法模式和抽象工廠模式,這次我來講一些生成器模式。生成器模式我也用的比較多。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.產品的部件由專門的生產廠商來生產,這樣分工...