工廠方法模式引導

2021-08-19 15:34:22 字數 3147 閱讀 1954

// ******fatroy.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

//int _tmain(int argc, _tchar* argv)

////包含必要的標頭檔案

#include #include /*

直接看工廠方法模式不容易理解,為此特增加此模式來很好的引出23種的工廠方法與抽象工廠模式

此模式不屬於gof四人幫的23種設計模式之一。

*/class fiscaldiskbase

virtual void printname()

protected://之所以用保護就是為了fiscaldiskbase不能被例項化

//預設建構函式為保護訪問級別

//意味著fiscaldiskbase 不能被例項化必須繼承

fiscaldiskbase(){}//無參構造

fiscaldiskbase(const std::string & name) :m_strname(name)//有參構造

std::string m_strname;//fiscaldisk廠商名稱

};//生產同一種產品有多家

//愛信諾

class aisinofiscaldisk :public fiscaldiskbase

void printname() };

//巨集思

class hsfiscaldisk :public fiscaldiskbase

void printname() };

//國家資訊保安技術研究中心(national information security engineering center)

class nisecfiscaldisk :public fiscaldiskbase

void printname() };

//工廠

class fiscaldiskfactory

};//測試函式

void ******factory()

int main(void)

/*簡單工廠模式:定義了乙個穿件物件物件的介面 (fiscaldiskfactory),

根據所提供的引數決定建立出哪乙個實體類的乙個例項。簡單工廠

模式封裝了物件的建立過程。

由於建立函式為靜態函式所以也有人取別名為靜態工廠。

如下類圖可以看出 ,factory工程建立產品(concreateproduct ),而產品屬於抽象的abstractproduct 它裡面有個操作printname,可以有很多個操作。產品可以有個所以都繼承抽象的abstractproduct。

可以看出測試用例中printname函式中,利用多型性掉了自己的printname然後顯示的執行基類的printname。

為什麼要用這種簡單的工程模式?

答:為了提高高內聚(即類的介面或函式職責單一,有內聚性)松耦合(即類與類之間關係盡量的少)。其實我們經常抽象出一些類的公共介面已形成抽象基類或介面,這樣可以宣告乙個指向基類的指標指向實際子類的實現從而達到多型的目的。即用了多型。但是這種方法很容易產生了2個問題。也就是上面的用了多型後大量的子類繼承自抽象基類,我們不得不再每次使用到子類的地方寫上new ***();的**,就是我們上面**中工程類fiscaldiskfactory 裡面的建立函式,裡面就得新增new  物件,這樣帶來2個問題:

1、客戶程式設計師必須知道子類的名稱,當系統複雜時,為了處理可能的名字衝突,可能使用不具有很好的可讀性和可記憶性的名字。很多子類太多了 我們可能使用了一堆很長的類名稱以防止名字衝突,(我們例子當中簡單工廠如使用了別名  縮寫名引數化建立的例項化了某乙個物件)。

2、程式的擴充套件和可維護性越來越困難。大量的new  不容易查詢。(我們例子當中簡單工廠提供乙個函式裡面集中了所有的new例項化物件容易查詢)

所以這就是上面的簡單工廠解決的問題。通過定義建立物件的介面,封裝物件的建立,與客戶端程式員無關,增強了程式的可擴充套件性extension 及可維護性。(可擴充套件性其實並不是很強只是相對不使用這種方法要好很多)

extension擴充套件性這裡解釋下是不需要修改你的**只需要增加 (如果通過繼承) 物件的組合方式,你不要使用類庫的源**這種情況下我們稱之為擴充套件。

modification修改性這裡是必須修改源**才能夠實現一些功能。

對於很多類庫都是第三方庫商業庫不提供源**就提供乙個標頭檔案和乙個dll庫,這種情況下你沒有源**既沒有辦法進行原始碼級別的修改。這個時候如果這商業**做的不好那麼我們就會很痛苦,所以對於物件導向來說有乙個很重要的事情就是讓程式具有擴充套件性意味著只需增加不需要修改原始碼。

我們例子當中的主要是有3個類:

1、fiscaldiskbase 定義所建立的產品介面

2、aisinofiscaldisk、hsfiscaldisk、nisecfiscaldisk 這3個產品類實現介面。

3、fiscaldiskfactory 定義了乙個方法,內部建立實際的產品並返回基類位址。

這種簡單工廠方法適用於工具包或框架的開發。

這種方法有如下優缺點:

優點:工廠類是整模式的關鍵,包含了必要的邏輯判斷,根據外界給定的資訊,決定究竟應該建立那個具體類的物件通過使用工廠類,外界可以從直接建立具體產品物件的尷尬局面擺脫出來僅僅需要負責「消費」物件就可以了。而不必管這些物件究竟如何建立及如何組織的,明確了各自的職責和權利,有利於整個軟體體系結構的優化(這主要是針對使用者的優點)。

缺點:由於上面的簡單工廠類集中了所有例項的建立邏輯,違反了高內聚責任的分配原則,將全部建立邏輯集中到乙個工廠類中;它所能建立的類也只能是事先考慮到的,如果需要增加新類,則就需要改變工廠類了。(當然據說hook可以解決但這不符合物件導向的概念)當系統中的具體產品類不斷增多時候,可能會出現要求工廠類根據不同條件建立不同的例項需求,這種對條件的判斷和對具體產品型別的判斷交錯在一起,很難避免模組功能的蔓延,對系統的維護和擴充套件非常不利。

而這些缺點在以後的23種設計模式中的工廠方法模式中得到一定的克服解決。

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

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

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

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

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

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