工廠方法模式

2021-10-13 07:43:53 字數 3080 閱讀 4602

「物件建立」模式

通過「物件建立」模式繞開new,來避免物件建立(new)過程中所導致的緊耦合(依賴具體類),從而支援物件建立的穩定。它是介面抽象之後的第一部工作。

典型模式有

在軟體系統中,經常面臨著建立物件的工作;由於需求的變化,需要建立的物件的具體型別經常變化。

那麼就出現了一些問題:如何應對這種變化?如何繞過常規的物件建立的物件方法(new),提供一種「封裝機制」來避免客戶程式和這種「具體物件建立工作」的緊耦合?

class

filespilter};

intmain()

假設上面這段**是為了實現乙個檔案分割的功能

這是乙個非常簡單的物件使用模式,那麼它有什麼問題呢?

目前看來好像是沒有什麼問題,我們需要在乙個變化的場景中看問題,看到它未來變化的需求。根據面向介面的設計原則,那麼我們就要去做乙個抽象類(介面)。面向介面的程式設計告訴我們,乙個物件的型別往往應該宣告成介面或抽象類,而不應該宣告成具體的類。

class

isplitter};

class

binaryspiltter

:public isplitter

;class

txtsplitter

:public isplitter

;class

picturesplitter

:public isplitter

;class

videosplitter

:public isplitter

;class

main

}

面向介面程式設計最簡單的表現形式就是變數要宣告成抽象基類。

那麼我們為什麼要實現面向介面程式設計呢?根據設計模式的依賴倒置原則:應該依賴抽象,不應該依賴實現細節。

isplitter *splitter =

newtxtsplitter

(filepath, number)

;

上面這行**等號的左邊是抽象依賴,而右邊是細節依賴,那麼在編譯時總體還是要依賴txtsplitter();屬於編譯時的細節依賴,違背了依賴倒置原則。

那麼該怎麼實現呢?總不可能去new乙個介面吧。

我們回顧一下物件建立模式的目標:繞開new,來避免物件建立(new)過程中所導致的緊耦合。

不能用new,那麼我們該怎麼做呢?

看看下面這個實現

class

splitte***ctory};

class

isplitter};

class

binaryspiltter

:public isplitter

;class

txtsplitter

:public isplitter

;class

picturesplitter

:public isplitter

;class

videosplitter

:public isplitter

;class

main

}

這麼做貌似是改善了一些,但是問題依然沒有解決,main()最終還是要依賴txtsplitter,只不過是繞了一層。還是沒有解決。

我們來回顧以下,c++在執行時依賴是怎麼實現的?自然是虛函式了。

class

isplitter};

class

splitte***ctory};

class

binaryspiltter

:public isplitter

;class

txtsplitter

:public isplitter

;class

picturesplitter

:public isplitter

;class

videosplitter

:public isplitter

;class

main

}

利用c++的多型,我們把真正建立物件交給未來,也就是splitte***ctory,進行執行時建立

//抽象類

class

isplitter};

//工廠基類

class

splitte***ctory};

class

binaryspiltter

:public isplitter

;class

txtsplitter

:public isplitter

;class

picturesplitter

:public isplitter

;class

videosplitter

:public isplitter

;class

binaryspiltte***ctory

:public splitte***ctory};

class

txtspiltte***ctory

:public splitte***ctory};

class

picturespiltte***ctory

:public splitte***ctory};

class

videospiltte***ctory

:public splitte***ctory};

class

main

void

method1()

}

我們可以看到,每乙個具體的類都有乙個對應的工廠,但是實現時,我們只需要建立乙個工廠。通過這樣的改良後,main不依賴具體類。

松耦合並不是把變化給消滅掉,而實際上是將它放在乙個區域性的地方。

現在來總結一下:

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

———《設計模式》gof

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

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

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

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

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

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