美文网首页
由浅入深工厂模式

由浅入深工厂模式

作者: 7ee64cf5edb2 | 来源:发表于2019-08-19 20:52 被阅读0次

    [TOC]

    工厂模式

    简单工厂模式

    用一个单独的类来做创造实例的过程,就是简单工厂

    #include <iostream>
    using namespace std;
    
    class AbstractProduct {
    public:
        virtual ~AbstractProduct() {} 
        virtual void Operation() = 0;
    };
    
    class ProductA : public AbstractProduct {
    public:
        void Operation() { cout << "ProductA" << endl; }
    };
    
    class ProductB : public AbstractProduct {
    public:
        void Operation() { cout << "ProductB" << endl; }
    };
    
    class Factory {
    public:
        AbstractProduct* createProduct(char product) {
            AbstractProduct* ap = NULL;
            switch(product) {
                case 'A': ap = new ProductA(); break;
                case 'B': ap = new ProductB(); break;
            }
            return ap;
        }
    };
    
    int main() {
        Factory* f = new Factory();
        AbstractProduct* apa = f->createProduct('A');
        apa->Operation();  // ProductA
    
        AbstractProduct* apb = f->createProduct('B');
        apb->Operation();  // ProductB
    
        delete apa;
        delete apb;
        delete f;
    
        return 0;
    }
    

    缺点:

    不符合开闭原则

    工厂方法模式

    工厂方法模式定义了一个用于创建对象的接口,让子类决定实例化哪一个类

    #include <iostream>
    using namespace std;
    
    class AbstractProduct
    {
    public:
        virtual ~AbstractProduct(){}
        virtual void Operation() = 0;
    };
    
    class ProductA : public AbstractProduct
    {
    public:
        void Operation() {cout << "ProductA" << endl;};
    };
    
    class ProductB : public AbstractProduct
    {
    public:
        void Operation() {cout << "ProductB" << endl;};
    };
    
    class AbstractFactory
    {
    public:
        virtual ~AbstractFactory() {}
        virtual AbstractProduct* FactoryMethod() = 0;
    };
    
    class FactoryA : public AbstractFactory
    {
    public:
        ~FactoryA() {}
        ProductA* FactoryMethod(){
            return new ProductA();
        }
    };
    
    class FactoryB : public AbstractFactory
    {
    public:
        ~FactoryB() {}
        ProductB* FactoryMethod(){
            return new ProductB();
        }
    };
    
    int main(int argc, const char** argv) {
        AbstractFactory* fa = new FactoryA();
        AbstractProduct* a = fa->FactoryMethod();
        a->Operation();
    
        AbstractFactory* fb = new FactoryB();
        AbstractProduct* b = fb->FactoryMethod();
        b->Operation();
    
        delete a;
        delete b;
        delete fa;
        delete fb;
    
        return 0;
    }
    

    抽象工厂模式

    抽象工厂模式是工厂方法的进一步深化,在这个模式中,工厂类不单单可以创建一个对象,而是可以创建一组对象。

    AbstractFactory(抽象工厂)声明了一组用于创建对象的方法,注意是一组。
    ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建对象的方法,生成一组具体对象。
    AbstractProduct(抽象产品):它为每种对象声明接口,在其中声明了对象所具有的业务方法。
    ConcreteProduct(具体产品):它定义具体工厂生产的具体对象。

    #include <iostream>
    using namespace std;
    
    class AbstractProductA {
    public:
        virtual ~AbstractProductA(){}
        virtual void Operation() = 0;
    };
    
    class ProductA1 : public AbstractProductA {
    public:
        void Operation() {
            cout << "ProductA1" << endl;
        }
    };
    
    class ProductA2 : public AbstractProductA {
    public:
        void Operation() {
            cout << "ProductA2" << endl;
        }
    };
    
    class AbstractProductB {
    public:
        virtual ~AbstractProductB(){}
        virtual void Operation() = 0;
    };
    
    class ProductB1 : public AbstractProductB {
    public:
        void Operation() {
            cout << "ProductB1" << endl;
        }
    };
    
    class ProductB2 : public AbstractProductB {
    public:
        void Operation() {
            cout << "ProductB2" << endl;
        }
    };
    
    
    class AbstractFactory {
    public:
        virtual AbstractProductA* CreateProductA() = 0;
        virtual AbstractProductB* CreateProductB() = 0;
        virtual ~AbstractFactory(){}
    };
    
    class ConcreteFactory1 : public AbstractFactory {
    public:
        ProductA1* CreateProductA() {
            return new ProductA1();
        }
        ProductB1* CreateProductB() {
            return new ProductB1();
        }
    };
    
    class ConcreteFactory2 : public AbstractFactory {
    public:
        ProductA2* CreateProductA() {
            return new ProductA2();
        }
        ProductB2* CreateProductB() {
            return new ProductB2();
        }
    };
    
    int main() {
        AbstractFactory* af1 = new ConcreteFactory1();
        // 具体工厂创建对应的具体产品
        AbstractProductA* apa1 = af1->CreateProductA();  // 工厂1创建产品A
        apa1->Operation();  // ProductA1
    
        AbstractProductB* apb1 = af1->CreateProductB();  // 工厂1创建产品B
        apb1->Operation();  // ProductB1
    
        AbstractFactory* af2 = new ConcreteFactory2();
        AbstractProductA* apa2 = af2->CreateProductA();  // 工厂2创建产品A
        apa2->Operation();  // ProductA2
    
        AbstractProductB* apb2 = af2->CreateProductB();  // 工厂2创建产品B
        apb2->Operation();  // ProductB2
    
        delete apa1;
        delete apa2;
        delete af1;
        delete apb1;
        delete apb2;
        delete af2;
        return 0;
    }
    
    

    对象工厂

    当系统中抽象基类中有很多具体子类,采用上述方式扩展成本极高。函数指针通过引入一个从type到函数指针的索引,使得程序实现非常优雅。

    
    

    参考文章:

    1. 工厂模式C++
    2. 对象工厂(1)---和万恶的 switch 说再见
    3. 对象工厂(2)---一个泛化的工厂类
    4. 《Modern C++ Design》(C++设计新思维)源码下载

    相关文章

      网友评论

          本文标题:由浅入深工厂模式

          本文链接:https://www.haomeiwen.com/subject/uvghsctx.html