简单工厂模式:继承于基类的子类,创建过程交于一个工厂来创建,通过赋予不同的创建标识来创建不同的子类
优点 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(); } }