#pragma once優缺點:這種工廠適用於物件不多的情況下,否則工廠類必須要知道所有類struct
iobjecta
;class
objecta
:public
iobjecta
};struct
iobjectb
;class
objectb
:public
iobjectb
};class
objectfactory
break
;
case
2:
break
; }
}};class
objecttest
};
對於乙個比較大的專案如果有較多的物件就不適合了
二.使用__uuidof簡化型別建立
借助這個關鍵字,可以為乙個類指定乙個guid
[如下**:uuid(
"f5844c2a-50d1-4f2c-85db-429729927f0f")]
struct
iobjecta
;
以上的使用方式對外確實便利了很多template
<
typename
t>
static
t* create()
else if
(isequalguid(id,
__uuidof
(iobjectb
)))
return nullptr
; }
static void
test2()
下面來解決if else的問題,
三.使用map來儲存
1.由於map要使用guid來作為key,那麼就需要乙個比較函式
來看一下isequalguid的實現,實際是乙個巨集,對字串的比較
__inline int2.為了可以靈活建立物件,我們可以使用函式指標來建立物件isequalguid(
refguid
rguid1
, refguid
rguid2
)
基於以上2點,我們建立來以下資料結構
接著要初始化各個物件的建立函式typedef void
(*createfunc
)(void
** ppvoid);
struct
guidcompare
};static
std::
map<
guid
,createfunc
,guidcompare
> m_mapobj;
3.再次改造乙個create方法template
<
typename t,
typename
i>
static void
createinstance(
void
** ppvoid
)
static void
init()
4.測試**template
<
typename
t>
static
t* createfrommap()
return nullptr
; }
以上步驟不再用乙個乙個的判斷物件的guid,唯一的問題點在於初始化的問題static void
test3()
四.借助全域性物件初始化來註冊
封裝乙個register方法
如果直接全域性來呼叫這個方法的話顯的有些暴力,而且容易出錯,重複註冊,可以借助乙個輔助類在建構函式內完成template
<
typename t,
typename
i>
static void
register()
register<
objecta
,iobjecta
>();
class上面的**就完成的差不多了,上面的**就是力氣活來,可以再想辦法簡化objectacreatehelper
};class
objectbcreatehelper
};objectacreatehelper
g_objectacreatehelper;
objectbcreatehelper
g_objectbcreatehelper;
五.使用巨集和模板來簡化註冊
template現在就全部完成了整個步驟的改造,此思想可以用到很多類似的物件建立方法,很管用<
typename t,
typename
i>
class
cobjectcreatehelper
};#define
reg_createobject
(t, i)
cobjectcreatehelper
g_##t;
reg_createobject
(objecta
,iobjecta
)reg_createobject
(objectb
,iobjectb
)
Object Factories 物件工廠
1,為什麼需要物件工廠?我們建立乙個物件時,必須給出具體型別,new a也好,new b也罷。a,b都是物件的型別。我們向來反對寫hardcode,但卻在建立物件時必須hardcode。如果需要根據使用者的輸入資訊,或是網路反饋資訊,或是文字檔案資訊來建立物件時,應該怎麼辦呢?最初我們想法可能是這樣...
PHP物件導向 工廠 抽象工廠模式
工廠模式 factory pattern 工廠模式,是用工廠方法代替new操作的一種模式。其實也可以將其理解成為乙個建立物件的工具類。在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用乙個共同的介面來指向新建立的物件。乙個呼叫者想建立乙個物件,只要知道其名稱就可以了。擴充套件性高...
工廠物件模式簡介
在gof的 設計模式 一書中,對factory method object method 意圖描述如下 定義乙個用於建立物件的介面,讓子類決定例項化是哪乙個類。factory metho是乙個類的例項化延遲到其子類。其結構圖如下 其中,類 product 定義了一類物件的介面。concretepro...