设计模式-工厂模式

工厂模式主要有简单工厂模式、工厂方法模式和抽象工厂模式
简单个工厂模式:
比如要创建一个计算器实现加减乘除,就可以建立各种运算类,在通过一个工厂返回某个运算类的实例。
UML:
这里写图片描述

//抽象运算类
class Operation {  
public:
    virtual double GetResult(double A, double B) { return 0; }
};
//加法类
class OperationAdd :public Operation {
public:
    double GetResult(double A,double B)
    {
        return A + B;
    }
};
//减法类
class OperationSub :public Operation {
public:
    double GetResult(double A, double B)
    {
        return A - B;
    }
};
//乘法类
class OperationMul :public Operation {
public:
    double GetResult(double A, double B)
    {
        return A * B;
    }
};
//除法类
class OperationDiv :public Operation {
public:
    double GetResult(double A, double B)
    {
        if (B != 0)
            return A / B;
        else
            cout << "Error";
    }
};
enum TYPE { Add=0, Sub, Mul, Div };
//简单工厂类
class Factory {
public:
    static Operation *CreateOperation(TYPE type)
    {
        Operation* oper = NULL;
        switch (type)
        {
        case Add:
            oper = new OperationAdd();
            break;
        case Sub:
            oper = new OperationSub();
            break;
        case Mul:
            oper = new OperationMul();
            break;
        case Div:
            oper = new OperationDiv();
            break;
        }
        return oper;
    }
};
int main()
{
    Operation *oper = Factory::CreateOperation(Add);
    cout<<oper->GetResult(2,3);
    system("pause");
    return 0;
}

简单工厂模式在增加新的类型时,需要修改工厂类,违背了开放封闭原则。所以就出现了工厂方法模式。

工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

简单来说就是每一个运算类通过各自的子工厂返回其实例,客户端直接使用子工厂。
UML:
这里写图片描述

前面部分一样,后面修改为

//抽象工厂类
class Factory {
public:
    virtual Operation *CreateOperation() = 0;
};
//加法工厂
class FactoryAdd :public Factory{
public:
    OperationAdd *CreateOperation()
    {
        return new OperationAdd();
    }
};
int main()
{
    Factory *Add = new FactoryAdd();
    Operation *oper = Add->CreateOperation();
    cout<<oper->GetResult(2,3);
    system("pause");
    return 0;
}

抽象工厂模式(Abstract Factory):提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。

假设一家公司不仅可以生产单核处理器,也能生产多核处理器。这家公司开设两个工厂,一个专门用来生产A型号的单核多核处理器,而另一个工厂专门用来生产B型号的单核多核处理器。
UML:
这里写图片描述

//单核    
class SingleCore
{
public:
    virtual void Show() = 0;
};
class SingleCoreA : public SingleCore
{
public:
    void Show() { cout << "Single Core A" << endl; }
};
class SingleCoreB :public SingleCore
{
public:
    void Show() { cout << "Single Core B" << endl; }
};
//多核    
class MultiCore
{
public:
    virtual void Show() = 0;
};
class MultiCoreA : public MultiCore
{
public:
    void Show() { cout << "Multi Core A" << endl; }

};
class MultiCoreB : public MultiCore
{
public:
    void Show() { cout << "Multi Core B" << endl; }
};
//工厂    
class CoreFactory
{
public:
    virtual SingleCore* CreateSingleCore() = 0;
    virtual MultiCore* CreateMultiCore() = 0;
};
//工厂A,专门用来生产A型号的处理器    
class FactoryA :public CoreFactory
{
public:
    SingleCore* CreateSingleCore() { return new SingleCoreA(); }
    MultiCore* CreateMultiCore() { return new MultiCoreA(); }
};
//工厂B,专门用来生产B型号的处理器    
class FactoryB : public CoreFactory
{
public:
    SingleCore* CreateSingleCore() { return new SingleCoreB(); }
    MultiCore* CreateMultiCore() { return new MultiCoreB(); }
};
int main()
{
    FactoryA *A = new FactoryA();
    A->CreateSingleCore()->Show();
    FactoryB *B = new FactoryB();
    B->CreateMultiCore()->Show();
    system("pause");
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值