简单工厂模式又叫做静态工厂方法模式。它的核心思想就是用一个工厂,根据输入的条件不同,从而产生不同的类,然后根据不同类的virtual函数得到不同的结果,这就理所当然的要求被创建的实例要具有共同的父类。

优点:工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。

缺点:简单工厂模式违背了“开放封闭原则”,即违背了“系统对扩展开放,对修改关闭”的原则,因为当我新增加一个产品的时候必须修改工厂类。另外它也违背了违背了单一职责原则。

类图如下:


代码如下:

#include<iostream>
using namespace std;

/* 抽象产品类 */
class Fruit{
public:    
    virtual void getName() = 0;
};

/* 具体产品类 */
class Banana :public Fruit
{
public:    
    virtual void getName() {        
        cout << "我是香蕉..." << endl;
    }

};

/* 具体产品类 */
class Apple :public Fruit
{
public:    
    virtual void getName() {        
        cout << "我是苹果..." << endl;
    }

};

/* 具体工厂类 */
class Factory{
public:    
    
    /* 根据输入不同,产生不同的具体产品类 */
    Fruit* creatFruit(const char* p ) {        
        if (0 == strcmp(p, "banana")) {            
            return new Banana;
        } else if (0 == strcmp(p, "apple")) {            
            return new Apple;
        } else {            
            cout << "没有这种水果:" << p << endl;            
            return NULL;
        }
    }

};

int main()
{
    Factory* f = new Factory;
    Fruit* fruit = f->creatFruit("apple");    
    if (fruit) {
        fruit->getName();        
        delete fruit;
    }

    fruit = f->creatFruit("banana");    
    if (fruit) {
        fruit->getName();        
        delete fruit;
    }

    fruit = f->creatFruit("人参果");    
    if (fruit) {
        fruit->getName();        
        delete fruit;
    }   
    delete f;
    system("pause");    
    return 0;

}

运行结果如下: