C 設計模式學習 一 Factory模式

2021-10-23 02:32:54 字數 2424 閱讀 7041

在物件導向系統設計中經常可以遇到以下的兩類問題:

1、為了提高內聚(cohesion)和松耦合(coupling),我們經常會抽象出一些類的公共介面以形成抽象基類或者介面。這樣我們可以通過宣告乙個指向基類的指標來指向實際的子類實現,達到了多型的目的。這裡很容易出現的乙個問題 n 多的子類繼承自抽象基類,我們

不得不在每次要用到子類的地方就編寫諸如 new zzz;的**。這裡帶來兩個問題 :1)客戶程式設計師必須知道實際子類的名稱,當系統複雜後,命名將是乙個很不好處理的問題,為了處理可能的名字衝突,有的命名可能並不是具有很好的可讀性和可記憶性,就姑且不論不同程式設計師千奇百怪的個人偏好了。程式的擴充套件性和維護變得越來越困難。

2)還有一種情況就是在父類中並不知道具體要例項化哪乙個具體的子類。這裡的意思為:假設我們在類 a 中要使用到類 b,b 是乙個抽象父類,在 a 中並不知道具體要例項化那乙個 b 的子類,但是在類 a 的子類 d 中是可以知道的。在 a 中我們沒有辦法直接使用類似於 new zzz的語句,因為根本就不知道zzz是什麼。

以上兩個問題也就引出了 factory 模式的兩個最重要的功能:

1)定義建立物件的介面,封裝了物件的建立;

2)使得具體化類的工作延遲到了子類中

通常使用 factory 模式來解決上面給出的兩個問題。在第乙個問題中,我們經常就是宣告乙個建立物件的介面,並封裝了物件的建立過程。factory 這裡類似於乙個真正意義上的工廠(生產物件)。在第二個問題中,我們需要提供乙個物件建立物件的介面,並在子

類中提供其具體實現。

#ifndef product_h

#define product_h

class product

;class concreteproduct:publicproduct

;#endif //~product_h

#include 「product.h」

#include

using namespace std;

product::product()

product::~product()

concreteproduct::concreteproduct()

concreteproduct::~concreteproduct()

#ifndef factory_h

#define factory_h

class product;

class factory

;class concretefactory:public factory

;#endif //~factory_h

#include 「factory.h」

#include 「product.h」

#include

using namespace std;

factory::factory()

factory::~factory()

concretefactory::concretefactory()

concretefactory::~concretefactory()

product* concretefactory::createproduct()

#include 「factory.h」

#include 「product.h」

#include

using namespace std;

void main()

factory 模式在實際開發中應用非常廣泛,物件導向的系統經常面臨著物件建立問題:要建立的類實在是太多了。而 factory 提供的建立物件的介面封裝(第乙個功能),以及其將類的例項化推遲到子類(第二個功能)都部分地解決了實際問題。乙個簡單的例子就是筆者開開發 visualcmcs 系統的語義分析過程中,由於要為文法中的每個非終結符構造乙個類處理,因此這個過程中物件的建立非常多,採用 factory 模式後系統可讀性性和維護都變得elegant 許多。factory 模式也帶來至少以下兩個問題:

1、如果為每乙個具體的 concreteproduct 類的例項化提供乙個函式體,那麼我們可能不得不在系統中新增了乙個方法來處理這個新建的 concreteproduct,這樣 factory 的介面永遠就不肯能封閉(close)。當然我們可以通過建立乙個 factory 的子類來通過多型實現這一點,但是這也是以新建乙個類作為代價的。

2、在實現中我們可以通過引數化工廠方法,即給factorymethod()傳遞乙個引數用以決定是建立具體哪乙個具體的 product(實際上筆者在 visualcmcs 中也正是這樣做的)。當然也可以通過模板化避免 1)中的子類建立子類,其方法就是將具體 product 類作為模板引數,實現起來也很簡單。可以看出,factory 模式對於物件的建立給予開發人員提供了很好的實現策略,但是factory 模式僅僅侷限於一類類(就是說 product 是一類,有乙個共同的基類),如果我們要為不同類的類提供乙個物件建立的介面,那就要用 abstractfactory 了。

[1]:《23種c++設計模式》

C 設計模式之 Factory模式

今天是決定開始學習一下設計模式的知識,之前對這個方面只是略微的聽說過,沒有真正的了解過這方面的內容,因此覺得有必要進行一些了解,以幫助我在以後的學習中更好的了解物件導向的知識。先從簡單的入手。factory模式是23種模式中最簡單和最容易入門的模式,因此在這裡先從這個模式入手。foctory模式,也...

工廠模式(Factory) 設計模式(一)

作用 定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。factory method 使乙個類的例項化延遲到其子類。工廠模式可分為三類,簡單工廠模式 工廠方法模式 抽象工廠模式 在本節,我們來討論一下簡單工廠模式和工廠方法模式。簡單工廠模式 舉個簡單的例子 肯德基可以 兩種不同風味的雞腿,具體賣...

設計模式 Factory

有一定程式設計經驗的xdjm對工廠方法模式肯定不會陌生了,曾經做過乙個遊戲大廳,那會的qt還沒有qml這個東東,為了能夠動態的載入頁面以及更加方便的除錯。每乙個window都是使用乙個xml去定義,裡面按照樹狀結構定義了各種型別的控制項。每個控制項都是widget的父類,window在載入介面時顯然...