這段時間一直忙於看
sql server2005
相關書籍,
c++雖然每天都在用,很多知識沒有複習,都漸漸荒廢了。。。
覺得作為乙個
c++程式設計師,基礎性的東西一定要經常複習,比如語法性的東西、比如方向性的東西,如設計模式、比如方法性的東西,如重構,比如一些對我來說全新的東西,如模板 1
、關於factory method
這兩天抽空複習了
gof版《設計模式》中的建立型模式,其實一直以來都對幾個建立型模式比較混,感覺都差不多(
singleton
除外)。雖然常常在用,但是分不清。比如:
**一:
//.h
class
cfactory
;//.cpp
cfactory* cfactory::m_pinstance = null;
cfactory* cfactory::getinstance()
cfactory* cfactory::freeinstance()
cproduct* cfactory::createproduct(producttype pt)
這是我經常使用的方式,這裡既使用了
singleton
模式,又使用了
factory method
模式,可是這裡究竟是否為
factory method
?我不確定,我覺得可能也可以叫做
build
模式,誰知道呢,反正用著感覺不錯。
通過重新閱讀
gof的《設計模式》,我發覺這確實是一種
factory method
模式,更準確的說,這叫做:引數化工廠方法。
factory method
更常用的方式是一對一,也就是乙個產品對應乙個
factory method
。這種一對一的
factory method
有個缺點,就是客戶可能僅僅為了建立乙個特定的
contreteproduct
物件,就不得不建立
creator
的子類。 2
、關於singleton模式
關於singleton
模式,其實我一直有乙個誤用,還是以剛才那個
cfactory
為例。
**二:
class
cfactory
}; 我已經忘了這種實現方式是從什麼地方看來的,一般情況下這樣的方式也確實能夠工作,但是如果這個實現方式在乙個
dll中,然後該
dll被多個客戶端呼叫的情況下,單例往往就不是單例了,一般都會有多個。我已經被這種實現方式禍害很多次了。
最好的方式還是使用**一中的實現方式,不過**一的實現方式有一點很討厭,就是一定要在程式推出的時候呼叫
freeinstance
,否則會有記憶體洩漏,而我們卻常常會忘記。
3、關於
prototype模式
偶爾會有聽說
prototype
模式,但是我一直以為這種模式不常用,覺得自己應該用不到,其實在日常開發的過程中,就常常在用。
如果要用一句話概括:所有對
clone
方法的實現對
prototype
模式的實現。
prototype
就是一種拷貝,就是用乙個已知的物件來建立乙個新的物件,該模式在我的圖形編輯器中就存在,在圖形編輯器中複製黏貼物件的時候,使用的就是該模式。
通過使用該模式,再結合
factory method
模式,還有原型註冊機制,我就可以用來實現我的圖元庫了。
4、關於
abstract factory
迄今為止,我還沒有使用過該模式,該模式也較為簡單,就是在幾類中定義出建立所有型別物件的介面,然後為每種系列的產品子類定乙個工廠子類,如此而已。
這種模式很不爽的一點就是:如果新增一種型別的產品,則要修改工廠基類和所有工廠子類的介面,修改量較大。
乙個可能的解決方案是:
abstract factory
中定義乙個帶引數的
make
方法,引數可以是乙個數字、乙個字串或者乙個列舉,這些都無所謂。然後在工廠內部定義乙個引數型別與產品型別的登錄檔,每次使用者呼叫
make
方法時,在
make
方法中就通過引數來在登錄檔內查詢指定型別的產品物件,然後呼叫該物件的
clone
方法即可建立乙個新的物件。
那麼問題又來了,工廠內的產品登錄檔從何而來呢?在下面的**實現中,這個登錄檔由每個工廠子類來建立。
**三:
class
cproduct;
//---------------------------------
//.h
//--------------------------------- //
抽象工廠
class
cabstractfactory ;
/ class
cfactory1:public cabstractfactory
/class
cfactory2:public cabstractfactory
//---------------------------------
//.cpp
//---------------------------------
#include
"stdafx.h"
#include
"abstractfactory.h"
std::map< std::string, cabstractfactory*> cabstractfactory::m_factorydict;
cabstractfactory::cabstractfactory(void)
cabstractfactory::~cabstractfactory(void)
void
cabstractfactory::register(const std::string strname, cproduct* pproduct)
cproduct* cabstractfactory::make(const std::string strname)
cabstractfactory* cabstractfactory::getinstance()
return m_factorydict[strenv]; }
///cfactory1::cfactory1()
cfactory2::cfactory2()
其實在該實現中,具體工廠可以不使用產品登錄檔,產品類也不需要實現clone方法,只需將make方法申明為virtual,然後在每個工廠子類中override該方法,在該方法內使用if else來判斷並建立具體的產品即可。如:
**四:
cproduct* cfactory2::make(const std::string strname)
5、關於builder
一直以來,我就將builder和factory method混淆。今天閱讀之後發現原來builder和abstract factory是類似的,但是builder更偏向於建立部件,builder最後一般會返回乙個成品。
Gof 設計模式 建立型
includeusing namespace std if 0 class a class b class c public a,public b int main endif 單例模式 if 0 class singleclass unlock return ms void test privat...
GoF23設計模式 建立型設計模式 單例模式
使用單例模式獲取物件時有且只有乙個物件 單例模式有五種方式 常用 餓漢式 懶漢式 其他 雙重檢測鎖式 內部類式 列舉式 詳解 package com.project.singleton 餓漢式單例 有點 效率高,執行緒安全 缺點 不能懶載入 public class hungrysingleton ...
建立型設計模式
建立型設計模式對類的建立例項化過程進行抽象,將物件的建立和物件的使用分離。簡單工廠模式 使用頻率4星 工廠方法模式 使用頻率5星 抽象工廠模式 使用頻率5星 建造者模式 使用頻率2星 原型模式 使用頻率3星 單例模式 使用頻率4星 toc 簡單工廠模式將物件建立和物件使用相分離,降低了系統耦合度。優...