c 物件工廠

2021-06-29 16:03:19 字數 3009 閱讀 7133

#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 int 

isequalguid(

refguid

rguid1

, refguid

rguid2

)

2.為了可以靈活建立物件,我們可以使用函式指標來建立物件

基於以上2點,我們建立來以下資料結構

typedef void

(*createfunc

)(void

** ppvoid);

struct

guidcompare

};static

std::

map<

guid

,createfunc

,guidcompare

> m_mapobj;

接著要初始化各個物件的建立函式

template

<

typename t,

typename

i>

static void

createinstance(

void

** ppvoid

)

static void

init()

3.再次改造乙個create方法

template

<

typename

t>

static

t* createfrommap()

return nullptr

; }

4.測試**

static void

test3()

以上步驟不再用乙個乙個的判斷物件的guid,唯一的問題點在於初始化的問題

四.借助全域性物件初始化來註冊

封裝乙個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...