设计模式应用与发展之工厂模式 c++篇 (二)

2014-11-24 02:39:42 · 作者: · 浏览: 4
眼。

一次次的代码更新,SVN上的代码号直接蹦到了5位数;当你部署代码时,看着运维冒着幽光的怨恨眼神,你叔忍了,但你婶认为绝不能忍;于是你发粪图墙……

4.2 福音
有一天,某位先祖发现自己的神器青铜大剑居然被一柄小匕首斩断了,擦啊,这是什么玩意?超神器?

呵呵,猪脚模式开启了,在代码界,你也发现了“神器”。

你先把这个名单弄到了数据库里(表名famous_persons):

然后,你用这把“神器”大刀阔斧把臃肿的CFamousPersons剁的稀烂。

再然后,你重造了一个轮子:

...

typedef void* (__stdcall*PExportClass)();

class CFamousPersons {

private:

CConnectionconn;

...

constchar* findPlugin(string name) {

char*pluginFile = "";

stringsqlCmd = "SELECT * FROM famous_persons WHERE Name=\"";

sqlCmd +=name;

sqlCmd +="\"";

CRecordset*rs = conn.executeQuery(sqlCmd);

if(!(rs->Eof()|| rs->Bof())) {

pluginFile= new char[256];

strncpy(pluginFile,rs->fieldValue(2), 256);

}

rs->destroy();

returnpluginFile;

}

public:

CPeople*find(string name) {

CPeople*people = NULL;

stringpluginFile = findPlugin(name);

if(!pluginFile.empty()){

HMODULEplugin = LoadLibrary(pluginFile);

if(plugin){

PExportClassexportClass = (PExportClass)GetProcAddress(plugin, "exportClass");

if(exportClass)

people = (CPeople*)exportClass();

}

}

returnpeople;

}

};

...

哇噢,酷!从此,你远离了CFamousPersons;远离了那糟糕的日子。生活貌似从这一刻又重新燃起了希望……

嗯,出乎意料的,你又做梦了,在梦里,你抛弃了数据库,增加了好些个辅助模块,代码简洁而优雅,充满美感……

5 蒸汽机时代
5.1 贪婪的欲望
终于,当我们的先祖们还沉浸在冷兵器时代,突如其来的炮火,把国门轰得稀烂;战火不断,黄金白银都顶不住火药的贪婪……

代码界里,你也终究没来得及亲自尝试抛弃数据库的喜悦,各种框架猝不及防的降临。

5.2 神赐
好吧,时间线已经很接近现实,不过先祖们始终没有得到神赐,一切都靠自力更生。

代码界里不一样,我们有了很多框架(神器)。比如说COM(恩,还有个学模学样的跨平台的XPCOM)。说起COM(应算是业界如雷灌招风耳的大神器了),听上去好像不是很沾边,但COM的CreateInstance其实现原理和应用机制,仍然是工厂模式。

当然,实现形式有了很大变化,就如他不采用名字,而是采用GUID映射;他不用数据库,而是使用注册表保存映射关系;他甚至还有自己的内存机制;有自己的数据类型等等。(广告:预知详情,请关注后续分享)。

6 另一个梦想