一、定义
   
    尽可能用简洁的语言描述:
    
    
     (1) 简单工厂模式:
    
    
    一个工厂,多个产品,产品需要有一个接口类。工厂类根据传入的参数,动态决定应该创建哪一类产品类,用产品基类指针指向实例化的产品并返回。
    
    
     (2) 工厂模式:
    
    
    多个工厂,多个产品,产品和工厂各有一个接口类。工厂和产品一一对应,一个工厂只负责生产一种产品。工厂接口类中声明一个创建产品的纯虚函数,各具体工厂类需重写该方法。
    
    
     (3) 抽象工厂模式:
    
    
    多个工厂,多个产品,每类产品又分为若干子系列,工厂有一个接口类,每一类产品都有自己的接口类,一个工厂可以生产多类不同的产品。
    
    举例:有Food和Car两类产品,每类产品都包含2个子系列A,B,故一共FoodA、FoodB、CarA、CarB四种,有两个工厂FactoryA、FactoryB,他们都能生产Food、Car两类产品,只不过FactoryA只生产FoodA和CarA,FactoryB只生产FoodB和CarB。工厂接口类中需声明创建产品的纯虚函数,有多少类产品,就有几个创建产品的纯虚函数。
   
具体可以看第二部分的代码演示,或者第三部分的参考文献。
    
    
    二、代码演示
   
    
    
    2.1 简单工厂模式
   
代码示意:
#include <iostream>
using namespace std;
/*一个工厂,多个产品,产品需要一个产品接口类,工厂根据传入参数决定创建哪种产品,
 *违反开闭原则(可以在原始代码的基础上新增代码,但不可以修改原始代码)*/
class Product {
public:
    virtual void show() = 0;
};
class ProductA : public Product {
public:
    void show() {
        cout << "this is product A" << endl;
    }
};
class ProductB : public Product {
public:
    void show() {
        cout << "this is product B" << endl;
    }
};
class Factory {
public :
    Product *createProduct(int flag) {
        Product *res = nullptr;
        if (flag == 1) {
            res = new ProductA();
        } else {
            res = new ProductB();
        }
        return res;
    }
};
int main() {
    Factory *f = new Factory();
    Product *p = f->createProduct(2);
    p->show();
    return 0;
}
    
     代码解释
    
    :有A、B两类产品,没有工厂前,用户需要哪类产品,就需要自己new一个产品出来,现在有了工厂,把制作产品的逻辑放到工厂类中,用户通过传入参数告诉工厂制作哪一类产品(传入参数1,表示创建产品A,传入参数2,表示创建产品B,因此工厂类中含有很多if else语句,或者switch case语句),工厂返回制作完成的产品。
    
    
     模式缺点
    
    :每新增或删除一个产品,都要修改工厂类的内部逻辑,违反
    
     开闭原则(可以在原始代码的基础上新增代码,但不可以修改原始代码逻辑)
    
    。
   
    
    
    2.2 工厂模式
   
代码示意:
#include <iostream>
using namespace std;
/*多个产品、多个工厂、产品和工厂各自都需要一个接口类,一个工厂负责生产一种产品
 *每新增一类产品,就需要新创建一个工厂类*/
// 产品
class Product {
public:
    virtual void show() = 0;
};
class ProductA : public Product {
public:
    void show() {
        cout << "this is product A" << endl;
    }
};
class ProductB : public Product {
public:
    void show() {
        cout << "this is product B" << endl;
    }
};
// 工厂
class Factory {
public :
    virtual Product *createProduct() = 0;
};
class FactoryA : public Factory {
public :
    Product *createProduct() {
        return new ProductA();
    }
};
class FactoryB : public Factory {
public :
    Product *createProduct() {
        return new ProductB();
    }
};
int main() {
    Factory *fa = new FactoryA();
    Factory *fb = new FactoryB();
    Product *pa = fa->createProduct();
    Product *pb = fb->createProduct();
    pa->show();
    pb->show();
    return 0;
}
    
     代码解释
    
    :有ProductA 、ProductA 两类产品,FactoryA 、FactoryB两个工厂,一个工厂负责生产一类产品,FactoryA 生产ProductA ,FactoryB 生产ProductB ,工厂的接口类中要定义创建产品的虚函数。
    
    
     模式缺点:
    
    :每新增一类产品,就需要新创建一个工厂类。
   
    
    
    2.3 抽象工厂模式
   
代码示意:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
/*多类产品、多个工厂,每类产品包含若干子系列,每个工厂可以生产多类产品
 *(工厂接口类中声明创建不同产品的方法),产品和工厂都需要接口类*/
// 第一类产品 Food
class Food {
public:
    virtual void show() = 0;
};
class FoodA : public Food {
public:
    void show() {
        cout << "this is food A" << endl;
    }
};
class FoodB : public Food {
public:
    void show() {
        cout << "this is food B" << endl;
    }
};
// 第一类产品 Car
class Car {
public:
    virtual void show() = 0;
};
class CarA : public Car {
public:
    void show() {
        cout << "this is car A" << endl;
    }
};
class CarB : public Car {
public:
    void show() {
        cout << "this is car B" << endl;
    }
};
// 工厂类
class Factory {
public :
    virtual Food *createFood() = 0;
    virtual Car *createCar() = 0;
};
class FactoryA : public Factory {
public :
    Food *createFood() {
        return new FoodA();
    }
    Car *createCar() {
        return new CarA();
    }
};
class FactoryB : public Factory {
public :
    Food *createFood() {
        return new FoodB();
    }
    Car *createCar() {
        return new CarB();
    }
};
int main() {
    Factory *fa = new FactoryA();
    fa->createFood()->show();
    fa->createCar()->show();
    Factory *fb = new FactoryB();
    fb->createFood()->show();
    fb->createCar()->show();
    return 0;
}
    
     代码解释
    
    :多类产品、多个工厂,每类产品包含若干子系列,
    
     每个工厂可以生产多类产品
    
    ,工厂接口类中声明创建不同产品的方法),产品和工厂都需要接口类。
    
    对应到代码中为:有Food和Car两类产品,每类产品包含A、B两个子系列,故有4类产品:FoodA、FoodB、CarA、CarB,有两个工厂FactoryA、FactoryB,其中FactoryA负责生产Food和Car的A系列产品,FactoryB负责生产Food和Car的B系列产品。
   
    
    
    三、参考文献
   
    (1)
    
     https://refactoringguru.cn/design-patterns/abstract-factory/cpp/example
    
    (代码写得好)
    
    (2)
    
     https://blog.csdn.net/linwh8/article/details/51232834
    
    (图画得好)
    
    (3)
    
     https://developer.aliyun.com/article/761946
    
    (代码和文字叙述的很好)
   
 
