1.意图
定义一个用于创建对象的的接口,让子类决定实例化哪一个类.
2.适用性
当一个类不知道它必须所创建的对象的类的时候。
当一个类希望由它的子类来指定它所创建的对象的时候。
3.抽象工厂和工厂方法的区别:
“抽象工厂”模式依赖于“工厂方法”模式的。因此,抽象工厂强调的是前面的动词“抽象”,也就是说,你将工厂方法模式中的工厂方法抽象出来的那个"动作或设计"就是“抽象工程”模式了。
---------------------------------
factory method针对的是一个产品等级结构
abstract factory是面向多个产品等级结构的
---------------------------------
工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
#include<iostream>
#include <string>
#include <iomanip>
using namespace std;
//产品基类
class Product {
public:
string _name;
public:
Product(const string& name) {
_name = name;
}
};
//具体产品
class ProductA :public Product {
public:
ProductA(const string& name) :Product(name) {};
};
class ProductB :public Product {
public:
ProductB(const string& name) :Product(name) {};
};
class ProductC :public Product {
public:
ProductC(const string& name) :Product(name) {};
};
//基类工厂
class Creator {
public:
//工厂方法 可由子类覆盖
virtual Product* Create(const string& productName) {
if (productName == "A") return new ProductA("A");
if (productName == "B") return new ProductB("B");
if (productName == "C") return new ProductC("C");
return nullptr;
}
};
class StanderCreator :public Creator {
public:
Product* Create(const string& productName) {
if (productName == "A") return new ProductB("B");
if (productName == "B") return new ProductA("A");
//这步操作表示具体工厂对其它类不感兴趣 交给基类去处理;
return Creator::Create(productName);
}
};
int main() {
Creator* creator = new StanderCreator();
Product* product = creator->Create("A");
cout << product->_name << endl;
}