关闭

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

69人阅读 评论(0) 收藏 举报
分类:

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:279次
    • 积分:40
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档