在需要對某個功能做拓展時,使用工廠模式能給**帶來盡量少的修改量。本文將通過遵循solid設計原則中的開閉原則和依賴倒置原則在c語言上實現工廠模式。
下面將使用解碼器功能作為例子進行講解,下圖為使用工廠模式設計的類關係圖和程式執行流程圖。
通過介面呼叫物件功能
以下為工廠類中的成員與成員函式。
/**
* @enum ret_t
* @annotation ["scriptable"]
* 函式返回值常量定義。
*/typedef
enum _ret_t ret_t;
/* decoder_factory.h */
#ifndef decoder_factory_h
#define decoder_factory_h
#include
"tkc/darray.h"
#include
"audio_decoder.h"
typedef decoder_t*
(*decoder_create_t)
(void);
/** * @class decoder_factory_t
* decoder工廠。
*/typedef
struct _audio_decoder_factory_t audio_decoder_factory_t;
/** * @method decoder_factory_instance
* 獲取decoder工廠例項。
* @annotation ["constructor"]
* @return 返回decoder工廠例項。
*/decoder_factory_t*
decoder_factory_instance
(void);
/** * @method decoder_factory_register
* 註冊decoder建立函式。
* @param factory decoder工廠物件。
* @param type 型別(如***)。
* @param create decoder建立函式。
* * @return 返回ret_ok表示成功,否則表示失敗。
*/ret_t decoder_factory_register
(decoder_factory_t* factory,
const
char
* type,
decoder_create_t create)
;/**
* @method decoder_factory_create_decoder
* 建立指定型別的decoder物件。
* @param factory decoder工廠物件。
* @param type 型別(如***)。
* * @return 建立decoder物件。
*/decoder_t*
decoder_factory_create_decoder
(decoder_factory_t* factory,
const
char
* type)
;#endif
/* decoder_factory_h */
註冊的實現方式是將物件建立的函式指標與型別使用結構體creator_item_t
**在一起,然後插入到動態陣列中。(**中使用的是awtk中的動態陣列darray,可以使用鍊錶等方式代替。)
#define name_len 31
#define return_value_if_fail(p, value) \
if (!(p))
typedef
struct _creator_item_t creator_item_t;
ret_t decoder_factory_register
(decoder_factory_t* factory,
const
char
* type,
decoder_create_t create)
decoder_factory_register
(decoder_factory_instance()
,"***"
, decoder_***_create)
;
通過型別在動態陣列中尋找對應函式指標建立物件。
decoder_t*
decoder_factory_create_decoder
(decoder_factory_t* factory,
const
char
* type)
decoder_***_t* ***_decoder =
decoder_factory_create_decoder
(decoder_factory_instance()
,"***"
);
在呼叫具體物件的建立函式時,讓物件的虛函式表指標vt
指向該型別的虛函式表,這樣就可以通過物件的虛函式表指標呼叫具體方法。詳情請檢視文章:用c語言實現c++繼承與多型。
/**
* @class decoder_t
* 解碼器介面。
*/struct _decoder_t
int32_t decoder_decode
(decoder_t* decoder,
void
* buff, uint32_t size)
ret_t decoder_destroy
(decoder_t* decoder)
typedef
struct _decoder_***_t decoder_***_t;
static int32_t decoder_***_decode
(decoder_t* decoder,
void
* buff, uint32_t size)
static ret_t decoder_***_destroy
(decoder_t* decoder)
static
const decoder_vtable_t s_decoder_***_vtable =
;decoder_t*
decoder_***_create
(void
)
decoder_decode
(***_decoder, buff,
sizeof
(buff));
decoder_destroy
(***_decoder)
;
在C語言中實現泛型程式設計
注意 返回值為void並不是沒有返回值,而是代表返回空型別,這就是你仍然可以在這些函式中使用return語句的原因。只有一些語言的建構函式和析構函式才沒有返回值,在這些函式中,不可以使用return語句,他們是有顯著的不同的,objective c是一門獨特的語言,它的類的初始化方法是乙個普通方法,...
C 中的Peek函式在C語言中實現
我朋友總是跟我說,c 是c的閹割版,我不反對,也不贊同。最近專案中,遇到乙個問題,就是如何在主程式執行的同時檢測串列埠的輸入,比如輸入 q 退出函式。同事推薦用c 的peek函式,可是我從進入工作以來,在linux專案中全部使用的是c,唯一知道去的輸入的就是getchar 了.該呼叫形式為cin.p...
設計模式C 實現 工廠模式
軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用c 寫了個小例子,加深一下理解。主要參考 大話設計模式 和 設...