C++工厂模式详解——设计模式(2)

简单工厂模式:

简单工厂模式是工厂模式中最简单的一种,他可以用比较简单的方式隐藏创建对象的细节,一般只需要告诉工厂类所需要的类型,工厂类就会返回需要的产品类,但客户端看到的只是产品的抽象对象,无需关心到底是返回了哪个子类。客户端唯一需要知道的具体子类就是工厂子类。除了这点,基本是达到了依赖倒转原则的要求。

假如,我们不用工厂类,只用CreateOperate和它的子类,那客户端每次使用不同的子类的时候都需要知道到底是用哪一个子类,当类比较少的时候还没什么问题,但是当类比较多的时候,管理起来就非常的麻烦了,就必须要做大量的替换,一个不小心就会发生错误。而使用了工厂类之后,就不会有这样的问题,不管里面多少个类,我只需要知道类型号即可。不过,这里还有一个疑问,那就是如果我每次用工厂类创建的类型都不相同,这样修改起来的时候还是会出现问题,还是需要大量的替换。所以简单工厂模式一般应该于程序中大部分地方都只使用其中一种“产品”,工厂类也不用频繁创建产品类的情况。这样修改的时候只需要修改有限的几个地方即可。

看了许多工厂模式的例子,觉得加减乘除运算工厂模式最能直观易懂的讲解工厂模式,当需要加法类的时候,调用工厂类的CreateOperate(),要指定生产相应的“产品”,见类图:

#include <iostream>
#include <string>
using namespace std;

class Operation
{
public:
	double numberA, numberB;
	virtual double  getResult()
	{
		return 0;
	}
};

class addOperation :public Operation
{
	double getResult()
	{
		return numberA + numberB;
	}
};

class subOperation :public Operation
{
	double getResult()
	{
		return numberA - numberB;
	}
};

class mulOperation :public Operation
{
	double getResult()
	{
		return numberA*numberB;
	}
};

class divOperation :public Operation
{
	double getResult()
	{
		return numberA / numberB;
	}
};

class operFactory
{
public:
	static Operation *createOperation(char c)
	{
		switch (c)
		{
		case '+':
			return new addOperation;
			break;

		case '-':
			return new subOperation;
			break;

		case '*':
			return new mulOperation;
			break;

		case '/':
			return new divOperation;
			break;
		}
	}
};

int main()
{
	Operation *oper = operFactory::createOperation('+');
	//Operation *oper = operFactory::createOperation('-');
	//Operation *oper = operFactory::createOperation('*');
	//Operation *oper = operFactory::createOperation('/');
	oper->numberA = 9;
	oper->numberB = 99;
	cout << oper->getResult() << endl;
	return 0;
}

调用工厂,需要createOperator("/"),就能返回除法运算符。

  优点:客户端不需要修改代码。

  缺点: 当需要增加新的运算类的时候,不仅需新加运算类,还要修改工厂类,违反了开闭原则。

二、工厂方法模式:

UML类图如下:

#include <iostream>
#include <string>
using namespace std;

class Operation
{
public:
	double numberA,numberB;
	virtual double  getResult()
	{
		return 0;
	}
};

class addOperation:public Operation
{
	double getResult()
	{
		return numberA+numberB;
	}
};

class subOperation:public Operation
{
	double getResult()
	{
		return numberA-numberB;
	}
};

class mulOperation:public Operation
{
	double getResult()
	{
		return numberA*numberB;
	}
};

class divOperation:public Operation
{
	double getResult()
	{
		return numberA/numberB;
	}
};

class IFactory
{
public:
	virtual Operation *createOperation()=0;
};

class AddFactory:public IFactory
{
public:
	static Operation *createOperation()
	{
		return new addOperation();
	}
};

class SubFactory:public IFactory
{
public:
	static Operation *createOperation()
	{
		return new subOperation();
	}
};

class MulFactory:public IFactory
{
public:
	static Operation *createOperation()
	{
		return new mulOperation();
	}
};

class DivFactory:public IFactory
{
public:
	static Operation *createOperation()
	{
		return new divOperation();
	}
};

int main()
{
	Operation *oper=MulFactory::createOperation();
	oper->numberA=9;
	oper->numberB=99;
	cout<<oper->getResult()<<endl;
	return 0;
}

这个和简单工厂有区别,简单工厂模式只有一个工厂,工厂方法模式对每一个产品都有相应的工厂

  好处:增加一个运算类(例如N次方类),只需要增加运算类和相对应的工厂,两个类,不需要修改工厂类。

  缺点:增加运算类,会修改客户端代码,工厂方法只是把简单工厂的内部逻辑判断移到了客户端进行。

 三、抽象工厂模式:

以股票行情沪深板块行情数据访问为例,行情源访问程序设计,不同的行情访问方式可能不一样,为了抽象对对不同行情的访问,可以将行情源隐藏起来,提供统一的访问方式,用多态进行实现。

#include <iostream>
#include <string>
using namespace std;

class Icode
{
public:
	virtual void Getcode()=0;
	virtual void Setcode()=0;
};

class ShenAcode:public Icode
{
public:
	void Getcode()
	{
		cout<<"在ShenA中返回code"<<endl;
	}
	void Setcode()
	{
		cout<<"在ShenA中设置code"<<endl;
	}
};

class ShangAcode:public Icode
{
public:
	void Getcode()
	{
		cout<<"在ShangA中返回code"<<endl;
	}
	void Setcode()
	{
		cout<<"在ShangA中设置code"<<endl;
	}
};

class Iindex
{
public:
	virtual void Getindex()=0;
	virtual void Setindex()=0;
};

class ShenAindex:public Iindex
{
public:
	void Getindex()
	{
		cout<<"在ShenA中返回index"<<endl;
	}
	void Setindex()
	{
		cout<<"在ShenA中设置index"<<endl;
	}
};

class ShangAindex:public Iindex
{
public:
	void Getindex()
	{
		cout<<"在ShangA中返回index"<<endl;
	}
	void Setindex()
	{
		cout<<"在ShangA中设置index"<<endl;
	}
};

class IFactory
{
public:
	virtual Icode *CreateCode()=0;
	virtual Iindex *CreateIndex()=0;
};

class ShenAFactory:public IFactory
{
public:
	Icode *CreateCode()
	{
		return new ShenAcode();
	}
	Iindex *CreateIndex()
	{
		return new ShenAindex();
	}
};

class ShangAFactory:public IFactory
{
public:
	Icode *CreateCode()
	{
		return new ShangAcode();
	}
	Iindex *CreateIndex()
	{
		return new ShangAindex();
	}
};

/*************************************************************/

class DataShangA
{
private:
	static string stock;
	//string stock="ShangA";
public:
	static Icode *CreateCode()
	{
		if(stock=="ShangA")
		{
			return new ShangAcode();
		}
		else if(stock=="ShenA")
		{
			return new ShenAcode();
		}
	}
	static Iindex *CreateIndex()
	{
		if(stock=="ShangA")
		{
			return new ShangAindex();
		}
		else if(stock=="ShenA")
		{
			return new ShenAindex();
		}
	}
};
string DataShangA::stock="ShenA";

/*************************************************************/

int main()
{
	//IFactory *factory=new ShenAFactory();
	IFactory *factory;
	Icode *code;
	Iindex *index;

	factory=new ShangAFactory();
	code=factory->CreateCode();
	index=factory->CreateIndex();

	code->Getcode();
	code->Setcode();
	index->Getindex();
	index->Setindex();

	code=DataShangA::CreateCode();
	index=DataShangA::CreateIndex();

	code->Getcode();
	code->Setcode();
	index->Getindex();
	index->Setindex();

		return 0;
}
时间: 2024-10-14 05:41:13

C++工厂模式详解——设计模式(2)的相关文章

Java研究之学习设计模式-简单工厂模式详解

 简介: 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 类图: 从UML类图中,可以看出,简单工厂模式的意思,就是把一个类内部,需要生成的部分,提取出来,变为一个工厂,通过工厂来new对象. 假设我们要吃苹果了,我们可以在代码中new一个苹果出来:当我们需要吃香蕉了,我们在代码中new一个香蕉出来.这种做法你会不会觉得麻烦

Java研究之学习设计模式-抽象工厂模式详解

 简介:          当每个抽象产品都有多于一个的具体子类的时候,工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产[1] 品角色都有两个具体产品.抽象工厂模式提供两个具体工厂角色,分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化.每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例. 每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式针对的是多个产品等级结构.(摘自百度百科) 话语说得太抽象,程序员最好的表示方式

二、设计模式总览及工厂模式详解

二.架构师内功心法之设计模式 2.架构师内功心法之设计模式 2.1.课程目标 1.通过对本章内容的学习,了解设计模式的由来. 2.介绍设计模式能帮我们解决哪些问题. 3.剖析工厂模式的历史由来及应用场景. 2.2.内容定位 不用设计模式并非不可以,但是用好设计模式能帮助我们更好地解决实际问题,设计模式最重要的 是解耦.设计模式天天都在用,但自己却无感知.我们把设计模式作为一个专题,主要是学习设计模式 是如何总结经验的,把经验为自己所用.学设计模式也是锻炼将业务需求转换技术实现的一种非常有效 的方

工厂模式详解

在java中每当看到new 就会想到"具体",代码绑定着具体的类导致代码脆弱尤其是不利于进行修改. new 关键字本身没有错,需要的是我们针对接口编程,从而隔离掉系统可能发生的一系列改变.重要设计原则:对扩展开放,对修改关闭. Pizza orderPizza(String type) { Pizza pizza; if (type.equals("cheese")) { pizza = new CheesePizza(); } else if (type.equa

创建和使用解耦——工厂模式详解(工厂方法+抽象工厂)

1.前言 直接new一个对象是最简单的创建对象的方式,但大量出现在业务代码中会带来至少两个问题.1:创建对象的细节直接暴露在业务代码中,修改实现细节必须修改相关的大量客户端代码.2:直接面向具体类型编程,违反了面向接口编程的原则,系统进行扩展时也不得不进行大量修改.要使得系统具有的良好的可扩展性以及后期易于维护,必须实现对产品的获取和对产品的使用解耦.要做到这两点,首先要对客户端代码屏蔽掉创建产品的细节,其次,客户端必须面向产品的抽象编程,利用java的多态特性在运行时才确定具体的产品.而这,正

设计模式之 简单工厂模式详解

定义:从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现.             定义中最重要的一句话就是,由一个工厂对象决定创建出哪一种产品类的实例,这个LZ在下面会专门举一个现实应用中的例子去展现. 另外给出简单工厂模式的类图,本类图以及上面的

2018.4.4 设计模式之简单工厂模式与抽象工厂模式详解(一)

1设计模式 简介 设计模式时一套被反复使用的多数人知晓的.经过分类编目的.代码设计经验的总结.设计模式使代码设计真正工程化,模式是软件工程的基石. 2.什么是GOF(四人帮 . Gang of Four) Design Patterns-Elementes of ReusableObject -Oriented Software (中文译名:设计模式-可复用的面向软件元素) 四位作者合成GOF,他们所提出的设计模式主要是基于鱼虾的面向对象设计原则 对接口编程儿不是对实现编程: 优先使用对象组合而

JS设计模式——工厂模式详解

工厂模式是另外一种关注对象创建概念的创建模式.它的领域中同其它模式的不同之处在于它并没有明确要求我们使用一个构造器.取而代之,一个工厂能提供一个创建对象的公共接口,我们可以在其中指定我们希望被创建的工厂对象的类型. 简单工厂模式:使用一个类(通常为单体)来生成实例 复杂工厂模式:使用子类来决定一个变量成员应该为哪个具体的类的实例. 简单工厂模式 var BicycleShop = function () { }; BicycleShop.prototype = { sellBicycle: fu

JAVA 设计模式之 工厂模式详解

一.简单工厂模式 简单工厂模式(Simple Factory Pattern)是指由一个工厂对象决定创建出哪一种产品类 的实例.属于创建型模式,但它不属于 GOF,23 种设计模式 (参考资料: http://en.wikipedia.org/wiki/Design_Patterns#Patterns_by_Type). 简单工厂模式适用于的场景: 1.适用 于工厂类负责创建的对象较少的场景,    2.且客户端只需要传入工厂类的参数,对于如何创 建对象的逻辑不需要关心. 简单工厂模式缺点: 1