今天一个好朋友发了上面这个贴,并邀我过去看看。就去看了看,当时觉得应该用工厂模式去解决,随便写了几句上去,后来又有冲动想写一下代码,正好重温一下经典的工厂模式,就写了如下代码。主要应用了工厂模式和单件模式。
现在如果要增加新的指令需要修改的地方也是相当地少:只要继承自CCommand,并实现自己的处理函数,然后向类工厂登记一下就可以了。
废话不多说了,看代码吧。感觉写这个东西学到不少东西,所谓温故而知新嘛。
先看问题:
有一个脚本文件,每行放一个命令,格式如下:
Name[,Parameter[,Value]]
其中,Parameter 和 Value 是可以省略的。Command分为不同的种类,对于特定的种类,Parameter 和 Value 是不是出现是一定的,如 "START"命令就没有Parameter 和 Value ,而"SEND"命令就有。头和我说,用类的层次结构来表示,外面在套一个解析类。我是这样做的
class CCommand{
string Name;
string Parameter;
string Value;
};
那么,按照我们头的说法,我需要:
class CStartCommang : public CCommand{
//在这里我需要做什么呢??
}
解析类CScriptExplain又该怎么定义呢?
我的参考代码,拷贝到一个.cpp文件中,即可编译、执行。我用的是VC6,相信MS的编译器也可以,GCC、BCB、DevC++应该也行。
#pragma warning(disable:4786)
#include <iostream>
#include <cassert>
#include <string>
#include <map>
#include <fstream>
//也可以采用构造函数无参,doCommand有参的方式,那样就可以全部CCommand的派生类做成单件。
class CCommand
{
protected:
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(){return m_strCmd;}
private:
std::string m_strCmd;
};
class CStartCommand:public CCommand
{
private:
CStartCommand(){}
CStartCommand(const std::string& strCmd):CCommand(strCmd)
{
//在这里解释strCmd里的Param和Value等
}
public:
virtual ~CStartCommand(){}
void doCommand()
{
//在这里做这个命令要做的事
std::cout << "Doing Start Command!/t" << GetCommandString() << std::endl;
}
static CCommand* CreateInstance(const std::string& strCmd)
{
CCommand* pCmd = new CStartCommand(strCmd);
return pCmd;
}
};
class CSendCommand:public CCommand
{
private:
CSendCommand(){}
CSendCommand(const std::string& strCmd):CCommand(strCmd)
{
//在这里解释strCmd里的Param和Value等
}
public:
virtual ~CSendCommand(){}
void doCommand()
{
//在这里做这个命令要做的事
std::cout << "Doing Send Command!/t" << GetCommandString() << std::endl;
}
static CCommand* CreateInstance(const std::string& strCmd)
{
CCommand* pCmd = new CSendCommand(strCmd);
return pCmd;
}
};
typedef CCommand*(*CreateInstanceFunc)(const std::string&);
class CCommandFactory
{
private:
CCommandFactory(){}
public:
virtual ~CCommandFactory(){}
static CCommandFactory* GetInstance()
{
static CCommandFactory ins = CCommandFactory();
return &ins;
}
void AddCommandFunc(std::string& strCmdName, CreateInstanceFunc func)
{
m_CommandFuncMap[strCmdName] = func;
}
CCommand* CreateCommand(std::string& strCmdName, std::string strCmd)
{
return m_CommandFuncMap[strCmdName](strCmd);
}
void ReleaseCommand(CCommand* p)
{
assert(p);
delete p;
}
private:
std::map<std::string, CreateInstanceFunc> m_CommandFuncMap;
};
class CScriptExplain
{
public:
void doFile(const char* strFileName)
{
CCommandFactory* pFactory = CCommandFactory::GetInstance();
std::ifstream f(strFileName);
#define MAX_CMD_LEN 256
char strCmd[MAX_CMD_LEN];
char tmp[MAX_CMD_LEN];
do{
f.getline(strCmd, MAX_CMD_LEN);
if(strlen(strCmd)==0)break;
int idx = 0;
for(; idx < MAX_CMD_LEN; ++idx)
{
if(strCmd[idx]==','||strCmd[idx]=='/0')break;
tmp[idx] = strCmd[idx];
}
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()
{
CCommandFactory* pFactory = CCommandFactory::GetInstance();
pFactory->AddCommandFunc(std::string("Start"), CStartCommand::CreateInstance);
pFactory->AddCommandFunc(std::string("Send"), CSendCommand::CreateInstance);
CScriptExplain se;
se.doFile("my_script.txt");
return 0;
}
***************
my_script.txt的内容:
Start
Send,Port,5555
Send,Port,8888
Send,Port,8673
分享到:
相关推荐
设计模式之单实例模式,用java实现的单件模式(单实例模式),里面附有详细的注释!
c#工厂模式 简单工厂,抽象工厂,单件模式
模式 很好的例子模式 很好的例子模式 很好的例子模式 很好的例子模式 很好的例子设计模式的一 种单件 模式 很好的例子
单件模式实例,有极大的参考价值
24设计模式之禅 代理模式、单例模式、工厂模式实例代码 DEMO
C#采用桥接装饰模式工厂模式单实例模式实现绘图,能够组合出不同的属性,同时可以进行排序
C#中简单工厂模式实例(设计模式-创建型模式)
简单工厂模式开发的计算参数实例简单工厂模式开发的计算参数实例简单工厂模式开发的计算参数实例简单工厂模式开发的计算参数实例简单工厂模式开发的计算参数实例简单工厂模式开发的计算参数实例
本实例是java做的工厂模式例子,网上大多只有文章,没有源码,我根据那些文字抽空做了简单工厂模式,工厂模式,抽象工厂三个例子。压缩包里工有三个文件夹,factory1,factory2,factory3,分别是简单工厂模式,工厂模式...
java三种工厂模式文档+三个实例,里面有个word文档是学习文档 然后配套有三个项目学习
简单工厂模式 工厂方法模式 抽象工厂模式 示例代码
工厂模式的简介和实例代码
3. Qt工厂模式工程 4. Qt工厂模式例程 5. Qt工厂模式例子 6. 简单工厂模式 部分源码实例: // 奔驰工厂 class BenzFactory : public AFactory { public: ICar* CreateCar() { return new BenzCar(); } }; // ...
它将客户和类的实现分离,客户通过他们的抽象接口操纵实例,产品的类名也在具体工厂的实现中被分离,它们不出现在客户代码中。 l 它使得易于交换产品系列。一个具体工厂类在一个应用中仅出现一次——即在它初始化的...
oracle 数据库实例与操作模式
工厂方法模式java实例demo,来自刘伟老师的《设计模式》一书.rar
JAVA设计模式之代理模式实例
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:...
通过抽象工厂搜提供的接口,可以创建产品的家族,利用这个接口书写代码,我们...这是与博客《抽象工厂模式--GOF的23个之一》配套实例源代码,具体说明欢迎阅读。 如有好的建议,可留言或发至笔者邮箱:fzb_xxzy@163.com
简单工厂模式开发的计算参数实例简单工厂模式开发的计算参数实例简单工厂模式开发的计算参数实例简单工厂模式开发的计算参数实例简单工厂模式开发的计算参数实例简单工厂模式开发的计算参数实例