简单工厂模式和策略模式对比C++版本-大话设计模式

简单工厂模式和策略模式的区别?

简单工厂模式的实例化由工厂类来实现,用户只需要传递一个条件,由工厂生产出相应的类;

策略模式需要用户自己实例化类,传递的是实例化的对象。

简单工厂模式

 

//简单工厂模式
class drink
{
public:
    virtual void getResult(){}
};
class caffe:public drink
{
public:
    void getResult(){ cout << "caffe" << endl; }
};
class coke :public drink
{
public:
    void getResult(){ cout << "coke" << endl; }
};
class factory
{
public:
    static drink* create(int a){
        drink *p=0;
        switch (a)
        {
        case 0:
            p = new caffe();
            break;
        case 1:
            p = new coke();
            break;
        default:
            break;
        }
        return p;
    }
};
int main()
{
    drink* cup;
    cup = factory::create(1);
    cup->getResult();
    return 0;
}

策略模式

 

//策略模式
class strategy
{
public:
    virtual void getResult(){}
};
class steal :public strategy
{
public:
    string target;
    steal(string name){ target = name; }//构造函数
    void getResult(){ cout << "" << target << endl; }
};
class cheat :public strategy
{
public:
    string target;
    cheat(string name){ target = name; }//构造函数
    void getResult(){ cout << "" << target << endl; }
};
class context
{
public:
    strategy* m;
    context(strategy* a){
        m = a;
    }
    void getResult(){
        m->getResult();
    }
};
int main()
{
    int a = 0;
    context* xingdongdong=0;
    switch (a)
    {
    case 0:
        xingdongdong = new context(new cheat("赵阳"));
        break;
    case 1:
        xingdongdong = new context(new steal("钱东海"));
        break;
    default:
        break;
    }
    xingdongdong->getResult();
    return 0;
}

策略模式我能看到的好处是对对象有很大的自主权,可以指定参数(“赵阳”),但是总感觉多此一举,我为什么非要通过你context实例化,我直接实例化不就好了吗?

简单工厂模式与策略模式的结合

//简单工厂模式和策略模式结合
class strategy
{
public:
    virtual void getResult(){}
};
class steal :public strategy
{
public:
    void getResult(){ cout << "" <<  endl; }
};
class cheat :public strategy
{
public:
    void getResult(){ cout << "" <<  endl; }
};
class context
{
public:
    strategy* m;
    context(int a){
        switch (a)
        {
        case 0:
            m = new cheat();
            break;
        case 1:
            m = new steal();
            break;
        default:
            break;
        }
    }
    void getResult(){
        m->getResult();
    }
};
int main()
{
    context* xingdongdong = new context(1);
    xingdongdong->getResult();
    return 0;
}

优点:

1、不用自己实例化生产对象,只需要传递一个参数就可以通过工厂类完成

2、用户不需要知道生产对象的存在,只需要操作工厂类就可以

 

另外,我项目上用的严格来说不算设计模式,只是简单的多态,由于需要将采集的图像以两种格式存储下来,一种是单帧的bmp格式,另一种是raw连续帧大文件,两种方式只是存储格式和方法有差异,因此可以继承自同一个父类。

class DataSaverStrategy
{
};
class DataSaverStrategyA :public DataSaverStrategy
{

};
class DataSaverStrategyB :public DataSaverStrategy
{

};
int main()
{
    int a = 0;
    DataSaverStrategy *p;
    switch (a)
    {
    case 0:
        p = new DataSaverStrategyA();
        break;
    case 1:
        p = new DataSaverStrategyB();
        break;
    default:
        break;
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/hustwx/p/9414844.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值