设计模式-工厂模式

来源:互联网 发布:淘宝steam国区礼物 编辑:程序博客网 时间:2024/06/05 04:15

工厂模式主要有简单工厂模式、工厂方法模式和抽象工厂模式
简单个工厂模式:
比如要创建一个计算器实现加减乘除,就可以建立各种运算类,在通过一个工厂返回某个运算类的实例。
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