從例項重溫工廠模式和單件模式

2021-08-22 04:17:14 字數 2502 閱讀 7196

你可以在保持文章完整和保留本宣告的情況下**、分發和印刷等。

今天乙個好朋友發了上面這個貼,並邀我過去看看。就去看了看,當時覺得應該用工廠模式去解決,隨便寫了幾句上去,後來又有衝動想寫一下**,正好重溫一下經典的工廠模式,就寫了如下**。主要應用了工廠模式和單件模式。

現在如果要增加新的指令需要修改的地方也是相當地少:只要繼承自ccommand,並實現自己的處理函式,然後向類工廠登記一下就可以了。

廢話不多說了,看**吧。感覺寫這個東西學到不少東西,所謂溫故而知新嘛。

先看問題:

name[,parameter[,value]]

其中,parameter 和 value 是可以省略的。command分為不同的種類,對於特定的種類,parameter 和 value 是不是出現是一定的,如 "start"命令就沒有parameter 和 value ,而"send"命令就有。頭和我說,用類的層次結構來表示,外面在套乙個解析類。我是這樣做的

class ccommand;

那麼,按照我們頭的說法,我需要:

class cstartcommang : public ccommand

解析類cscriptexplain又該怎麼定義呢?

我的參考**,拷貝到乙個.cpp檔案中,即可編譯、執行。我用的是vc6,相信ms的編譯器也可以,gcc、bcb、devc++應該也行。

#pragma warning(disable:4786)

#include

#include

#include

#include

#include

//也可以採用建構函式無參,docommand有參的方式,那樣就可以全部ccommand的派生類做成單件。

class ccommand

ccommand(const std::string& strcmd):m_strcmd(strcmd){}

public:

virtual ~ccommand(){}

virtual void docommand()=0;

static ccommand* createinstance(const std::string& strcmd);

const std::string& getcommandstring()

private:

std::string m_strcmd;

};class cstartcommand:public ccommand

cstartcommand(const std::string& strcmd):ccommand(strcmd)

public:

virtual ~cstartcommand(){}

void docommand()

static ccommand* createinstance(const std::string& strcmd)

};class csendcommand:public ccommand

csendcommand(const std::string& strcmd):ccommand(strcmd)

public:

virtual ~csendcommand(){}

void docommand()

static ccommand* createinstance(const std::string& strcmd)

};typedef ccommand*(*createinstancefunc)(const std::string&);

class ccommandfactory

public:

virtual ~ccommandfactory(){}

static ccommandfactory* getinstance()

void addcommandfunc(std::string& strcmdname, createinstancefunc func)

ccommand* createcommand(std::string& strcmdname, std::string strcmd)

void releasecommand(ccommand* p)

private:

std::mapm_commandfuncmap;

};class cscriptexplain

if(idx == max_cmd_len)break;

tmp[idx] = '\0';

ccommand* pcmd = pfactory->createcommand(std::string(tmp), std::string(strcmd+idx));

pcmd->docommand();

pfactory->releasecommand(pcmd);

}while(true);}};

int main()

my_script.txt的內容:

start

send,port,5555

send,port,8888

send,port,8673

單例模式和工廠模式

實現思路 將構造方法私有化 宣告本類型別的靜態私有屬性 提供共有靜態方法獲取 本類物件 class static x new public static get class static x null public static get 優點 缺點 產品介面 public inte ce produ...

重溫設計模式之 簡單 工廠模式

定義乙個建立物件的介面,讓其子類自己決定例項化哪乙個工廠類,工廠模式使其建立過程延遲到子類進行。常用場景 多資料庫實現 多種媒介的日誌記錄 uml圖 客戶端 public class client 簡單工廠模式存在乙個問題,如示例中需要增加新的資料庫型別時,需要修改employeedaofactor...

設計模式 工廠模式和單例模式

在平常實用類的時候,往往要進行類功能的擴充套件,如果直接在裡面進行擴充套件,有可能會對類裡面的其他功能產生影響,所以在擴充套件功能的時候就要重新寫類,這就要採用繼承的方式,如 1 class yunsuan 2 8 9class jia extends yunsuan 造乙個加的子類繼承父類 10 ...