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

原创 2016年08月29日 21:49:38

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

23种设计模式(3)-工厂方法模式

一,设计原则解释        本节要学的工厂方法模式涉及两个设计原则:开-闭原则和依赖倒转原则。我感觉还是先把设计原则简单理解一下比较好,这样才能对设计模式的学习理解更深刻。1,开-闭原则 开-...

C#设计模式(3)——工厂方法模式

一、引言   在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方...

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

本文转自:http://www.cnblogs.com/guoshiandroid/archive/2010/06/25/1764813.html     让麦当劳的汉堡适合不同MM的不同口...
  • rzhzhz
  • rzhzhz
  • 2012年02月08日 17:21
  • 2524

创建型设计模式(3):工厂方法模式

动机 创建一个对象往往需要复杂的过程,所以不适合包含在一个复合工厂中,当有新的产品时,需要修改这个复合的工厂,不利于扩展。 而且,有些对象的创建可以需要用到复合工厂访问不到的信息,所以,定...

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

定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。 类型:创建类模式 类图: 工厂方法模式代码 [java] view plainco...

设计模式之工厂方法模式

  • 2017年08月23日 19:43
  • 22KB
  • 下载

设计模式——工厂方法模式

  • 2013年08月10日 15:56
  • 8KB
  • 下载

设计模式复习笔记 (3)创建型模式:工厂方法模式

模式定义: 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factor...

设计模式之工厂方法模式

  • 2014年08月17日 14:52
  • 40KB
  • 下载

设计模式之工厂方法模式

  • 2014年04月23日 11:24
  • 32KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式(3) 工厂方法模式
举报原因:
原因补充:

(最多只允许输入30个字)