工厂模式又叫做多态工厂模式。工厂模式的核心是在简单工厂模式之上在封装一个抽象工厂类,从而将创建工作推迟到抽象工厂类的子类中,这样做的最大好处是使工厂模式符合开闭原则。即在新增一个产品时,不再是修改具体工厂类的成员函数了,而是通过抽象工厂类派生出一个具体工厂类,在具体工厂类中实现新产品的生产。总之一句话就是:简单工厂模式+开闭原则=工厂模式。

优点:克服了简单工厂违背开放-封闭原则的缺点,又保留了封装对象创建过程的优点。

缺点:每增加一个产品,相应的也要增加一个子工厂类及产品类,加大了额外的开发量。

类图如下:


参考代码如下:

#include <iostream>


/* 抽象产品类 */
class Product {
public:
    virtual ~Product() { }

    /* 具体类的公共操作接口 */
    virtual void say() = 0;
};

/* 具体产品类 */
class ConcreteProduct :public Product {
public:
    ConcreteProduct() {
        std::cout << "ConcreteProduct..." << std::endl;
    }
    void say() {
        std::cout << "ConcreteProduct Say..." << std::endl;
    }
    ~ConcreteProduct() { }
};


/* 抽象工厂类 */
class Factory {
public:
    virtual Product* CreateProduct() = 0;
    virtual ~Factory() { }
protected:
    Factory() { }
};

/* 具体工厂类 */
class ConcreteFactory :public Factory {
public:
    ConcreteFactory() {
        std::cout << "ConcreteFactory..." << std::endl;
    }

    ~ConcreteFactory() {

    }

    Product* CreateProduct() {
        return new ConcreteProduct();
    }

};


int main() {
    Factory *factory = new ConcreteFactory();
    Product *product = factory->CreateProduct();
    product->say();

    delete factory;
    delete product;

    return 0;
}

运行结果如下: