从实例重温工厂模式和单件模式

news/2024/7/5 19:57:50
本文由恋花蝶最初发表于: http://blog.csdn.net/lanphaday,你可以在保持文章完整和保留本声明的情况下转帖、分发和印刷等。
 
http://community.csdn.net/Expert/topic/4892/4892570.xml?temp=.8727381
今天一个好朋友发了上面这个贴,并邀我过去看看。就去看了看,当时觉得应该用工厂模式去解决,随便写了几句上去,后来又有冲动想写一下代码,正好重温一下经典的工厂模式,就写了如下代码。主要应用了工厂模式和单件模式。
现在如果要增加新的指令需要修改的地方也是相当地少:只要继承自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
#include
#include
#include
#include
 
//也可以采用构造函数无参,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 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





http://www.niftyadmin.cn/n/3647634.html

相关文章

想自学Java的速来!MySQL索引为何选择B+树?复习指南

前言 又到一年金九银十之际。 Java作为目前用户最多&#xff0c;使用范围最广的软件开发技术之一。 Java的技术体系主要由支撑Java程序运行的虚拟机&#xff0c;提供各开发领域接口支持的Java,Java编程语言及许多第三方Jvav框架构成。 其中&#xff0c;以Java的虚拟器为今天的着…

以讹传讹的小故事大道理

本文由恋花蝶最初发表于http://blog.csdn.net/lanphaday&#xff0c;可以转载、印刷等&#xff0c;但不可用于商业用途。并敬请保留本文完整&#xff0c;及包含本声明。昨天在公司内网看到同事贴出下面的这个小故事&#xff0c;终于是忍不住要反驳一下&#xff0c;就写了下次的…

成功入职字节跳动!只用了几百行代码写的百度搜索引擎,先收藏了

前言 MySQL 是最流行的关系型数据库管理系统(RDBMS)之一。 MySQL作为一个关系型数据库管理系统&#xff0c;因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下&#xff0c;MySQL是管理内容最好的选择。虽然功能未必很强大&#xff0c;但因为它…

基本A*算法python实现

本文由恋花蝶发表于http://blog.csdn.net/lanphaday&#xff0c;可以在保证全文完整的前提下任意形式自由传播&#xff0c;但必须保留本声明&#xff0c;违反必究。最近因为一个任务要用到A*算法&#xff0c;就用C实现了一份。不过只是用A*来检测从A点到B点有无通路&#xff0c…

Java面试java基础,锁机制(本地锁+分布式锁)超全分析!已开源

前言 微架构的出现&#xff0c;很好地适应了这个时代对快速发展变化的要求。它不再提倡一体化的项目设计&#xff0c;而是对项目进行有效的“业务区”(可以简单理解为不同的子系统〉划分&#xff0c;并利用合理的技术对业务性能做出提升和改善&#xff0c;同时又极大地简化了配…

关于MSVC下QT项目的警告级别

关于MSVC下QT项目的警告级别&#xff1a;用MSVC创建一个QT 项目.似乎是自动设置成最低级别&#xff0c;WARNNING 1 ! 记住一定要自己设置回第三级别! 否则,无数C中会导致万劫不复的错误会被编译器放过 。举个例子&#xff1a;A.hclass A{public :A(){m_buf new char[1024*1024…

Java面试回忆录:你连基础的JVM运行时内存布局都忘了?相关资料参考

前言 微服务是近年来备受关注的话题&#xff0c;相比于传统的SOA而言&#xff0c;更容易理解&#xff0c;也更容易实践&#xff0c;它将“面向服务”的思想做得更加彻底。有人说它非常好&#xff0c;但就是“玩不起”&#xff0c;why&#xff1f; 微服务是一种分布式系统架构…

Java面试心得必备技能储备详解,层层深入

前言&#xff1a; 求职季在即&#xff0c;技巧千万条&#xff0c;硬实力才是关键&#xff0c;听说今年疫情大环境不好&#xff0c;更要好好准备才行。MySQL是Java程序员面向高级的必备技能&#xff0c;很多朋友在面试时经常在这里折戟沉沙&#xff0c;饮恨不已。熟练掌握MySQL知…