设计模式(3) 工厂方法模式

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;
}

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q6145989/article/details/52356649
个人分类: 设计模式
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭