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

由浅入深工厂模式

作者: 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++设计新思维)源码下载

相关文章

  • 由浅入深工厂模式

    [TOC] 工厂模式 简单工厂模式 用一个单独的类来做创造实例的过程,就是简单工厂 缺点: 不符合开闭原则 工厂方...

  • 由浅入深工厂模式

    工厂模式 工厂设计模式是软件开发中经常涉及到的一种设计方法,这里我们从浅入深一步一步介绍工厂模式的三种设计方法,即...

  • 常用设计模式

    设计模式 工厂模式 工厂模式思路上分:简单工厂模式,工厂模式, 抽象工厂模式// 抽象工厂模式可以代替工厂模式,做...

  • 工厂模式

    工厂模式细分三种:简单工厂模式、工厂模式、抽象工厂模式。 工厂模式相当于抽象了简单工厂模式的工厂类,而抽象工厂模式...

  • 工厂模式

    工厂模式 就是工厂---生产-->产品 在设计模式中,分为 简单工厂模式, 工厂方法模式,抽象工厂模式. 工厂模式...

  • 找女朋友之简单工厂模式,工厂模式,抽象工厂模式

    找女朋友之简单工厂模式,工厂模式,抽象工厂模式 找女朋友之简单工厂模式,工厂模式,抽象工厂模式

  • 【设计模式】- 工厂模式

    工厂模式分为三种:简单工厂模式、工厂方法模式和抽象工厂模式。 工厂模式:靠工厂生产对象 简单工厂模式中只有一个工厂...

  • 工厂模式

    工厂模式包含三种模式:简单工厂模式、工厂方法模式和抽象工厂模式。 简单工厂模式 定义简单工厂模式:由一个工厂类根据...

  • Java设计模式——工厂模式

    工厂模式简单工厂模式工厂方法模式抽象工厂模式 1.简单工厂模式 1.基本介绍1)简单工厂模式也叫静态工厂模式,是属...

  • 设计模式-3种工厂模式

    工厂模式包括:简单工厂模式,工厂方法模式,抽象工厂模式 简单工厂模式 工厂方法根据参数直接创建实例:工厂->产品 ...

网友评论

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

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