简单工厂模式

简单工厂模式:继承于基类的子类,创建过程交于一个工厂来创建,通过赋予不同的创建标识来创建不同的子类
优点
1.隐藏了对象创建的细节,将产品的实例化推迟到子类中实现。

2.不用关心使用的是哪个产品,只需要知道用哪个工厂就行了,提供的类型也可以用比较便于识别的字符串。

3.方便添加新的产品子类,每次只需要修改工厂类传递的类型值就行了。

4.遵循了依赖倒转原则。
缺点
1.子类的类型差不多,使用的方法名都相同,如果类比较多,而所有的类又必须要添加一种方法,则会是非常麻烦的事情。
或者是一种类另一种类有几种方法不相同,客户端无法知道是哪一个子类,也就无法调用这几个不相同的方法。
2.每添加一个产品子类,都必须在工厂类中添加一个判断分支,这违背了开放-封闭原则。
struct STRedisJsonData
{
    //指令类型
    int nCode;
    //json数据
    std::string strJson;
    //web id
    std::string strWebID;
    //json解析器
    Json::Reader reader;
    //json的根节点
    Json::Value root;
};
using STRedisJsonDataPtr = std::shared_ptr<STRedisJsonData>;
class CRedisBase: public std::enable_shared_from_this<CRedisBase>
{
public:
    CRedisBase();
    CRedisBase(STRedisJsonDataPtr p): m_pack(p)
    {
    }
    ~CRedisBase();
    virtual void HandleCmd(){};
    virtual int ParseJson(){ return 0; }
    virtual int Process(){ return 0; }
protected:
    STRedisJsonDataPtr m_pack; 
};
using CRedisBasePtr = std::shared_ptr<CRedisBase>;
class CGetData :public CRedisBase
{
public:
    CGetData(STRedisJsonDataPtr p)
        : CRedisBase(p){
    }
protected:
    virtual void HandleCmd();
    virtual int ParseJson() override;
};
CRedisBasePtr CRedisMgr::CreateHandler(STRedisJsonDataPtr data)
{
 CRedisBasePtr Handler = NULL;
 switch (data->nCode)
 {
 case 1001:
  Handler.reset(new CGetData(data));
  break;
 }
 return Handler;
}
void main()
{
    CRedisBasePtr Handler = g_RedisMgr.CreateHandler(ptrMsg);
    if (Handler)
    {
        Handler->HandleCmd();
    }
}
原文地址:https://www.cnblogs.com/osbreak/p/10106123.html