工廠方法模式

2021-10-07 03:43:19 字數 2351 閱讀 1682

什麼都明白的人最溫柔也最冷漠。

----- 網易雲熱評

定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。factory method使得乙個類的例項化延遲(目的:解耦,手段:虛函式)到子類。

需求還記得在講觀察者模式的時候,我們的需求是實現將大檔案分割成若干的小檔案。我們先看一下實現**:

class

mainform

:public form,

public iprogress

};

我們可以觀察到,我們建立物件的方式是直接new的這個物件。那麼我們知道根據面向介面程式設計原則,當我們需要對乙個類進行分類擴充套件時,物件的型別,我們應該將其宣告為抽象類或者介面。接下來我們就這麼做:

class

isplitter

}class

binarysplitter

:public isplitter

;class

txtsplitter

:public isplitter

;class

picturesplitter

:public isplitter

;class

videosplitter

:public isplitter

;

每個isplitter的子類都有其具體的實現。那麼我們應該這麼建立物件:

isplitter* splitter1 =

newbinarysplitter

(filepath, number)

;isplitter* splitter2 =

newtxtsplitter

(filepath, number)

;isplitter* splitter3 =

newpicturesplitter

(filepath, number)

;isplitter* splitter4 =

newvideosplitter

(filepath, number)

;

那麼根據依賴倒置原則我們應該依賴抽象,不該依賴實現細節。可以看到上面的建立例項**,左邊我們定義的是抽象型別,但是右邊我們還是要依賴實現細節。我們知道上面**建立物件我們都使用的new關鍵字,那麼我麼如何繞開new,來避免物件建立(new)過程中所導致的緊耦合(依賴具體類),從而支援物件建立的穩定呢?

我們來定義乙個工廠:

class

splitte***ctory};

// 建立物件..

. splitte***ctory factory;

splite***ctory* sp = factory.

createsplitter(.

..);

...

我們試圖以方法的形式建立物件,但是可以發現,還是無法脫離new的 「魔爪」 。我們還是依賴著具體實現… 那怎麼辦呢?仔細想想,我們上面直接建立物件都是編譯時依賴,能不能將它轉換成執行時依賴呢?

class

isplitter};

class

splitte***ctory};

// 建立物件..

.// 我們建立指標

splitte***ctory* factory;

// 真正建立物件時交給未來 (factory)

isplitter* splitter = factory-

>

createsplitter()

;...

針對要建立的具體物件,我們分別定義其生產該型別物件的工廠:

class

binarysplitte***ctory

:public splitte***ctory};

// 其他類和上述相似..

.

我們可以看到,每乙個具體的類,都有其對應的工廠。那麼你看到這裡也許很懵,這樣解決了我們原先遇到的問題了嗎?請繼續看下面的**改進:

class

mainform

:public form

void

button_click()

};

至此,我們可以看到mainform中已經極大程度的降低了依賴,我們可以觀察裡面的所有物件都是抽象的。依賴是不是已經降低了呢?

工廠方法模式 工廠方法模式

工廠方法模式是簡單工廠模式的公升級版,簡單工廠模式不符合設計模式的原則 即 單一職責,開閉原則 優點 職責明確,擴充套件方便 缺點 需要建立多個工廠 實現步驟 1.將工廠通用方法抽取介面 例如 ifactory 2.將產品抽取介面 例如 icar 3.實現各種產品 例如 baomacar,benti...

工廠方法模式 工廠方法模式 二

工廠方法模式是對簡單工廠的進一步抽象和封裝,需要新的類物件時不需要對既有工廠類進行修改,而是增加新的工廠類。工程類可以使用模版進一步封裝,由編譯器來生成 從而減少 編寫工作量。工廠方法的 c 實現01part產品抽象基類class animal virtual void show 0 02part產...

工廠方法模式(一) 簡單工廠方法模式

ps 第二篇學習部落格,堅持就是勝利。繼續設計模式的學習,記錄工廠模式,加深自己的理解。基本結構 abstractproduct 用來定義基本的商品的抽象 public abstract class abstractphoneproduct 用來實現抽象商品,生成各種商品 public class ...