设计模式(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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值