【有毒的设计模式】简单工厂模式

版权声明:O.O 欢迎转载,如果我有能力写到原创文章的话~ https://blog.csdn.net/qq_16468937/article/details/50958532

// Description :说些废话

唔,本来想偷懒不写设计模式的东西,但是自从上周被阿里巴巴电话面问出屎之后我还是决定好好复习一下设计模式吧。。。

还有就是应该用Markdown编辑器的,但是那排版我老感觉很抓急,排得不漂亮,还是用普通的吧 ...............    Orz 


//部分资料来源:

1.C++实现的简单工厂模式示例来源:http://www.jellythink.com/archives/42

2.运算的示例来源:程杰——大话设计模式


//正文:

简单工厂设计模式的适用场合——(摘自部分资料来源1那网址)

1.在程序中,需要创建的对象很多,导致对象的new操作多且杂时,需要使用简单工厂模式;

2.由于对象的创建过程是我们不需要去关心的,而我们注重的是对象的实际操作,所以,我们需要分离对象的创建和操作两部分,如此,方便后期的程序扩展和维护。



以下就是C++实现的一段代码:

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

typedef enum ProductTypeTag
{
	TypeA,
	TypeB,
	TypeC
}PRODUCTTYPE;

// Here is the product class
class Product
{
public:
	virtual void Show() = 0;
};

class ProductA : public Product
{
public:
	void Show()
	{
		cout<<"I'm ProductA"<<endl;
	}
};

class ProductB : public Product
{
public:
	void Show()
	{
		cout<<"I'm ProductB"<<endl;
	}
};

class ProductC : public Product
{
public:
	void Show()
	{
		cout<<"I'm ProductC"<<endl;
	}
};

// Here is the Factory class
class Factory
{
public:
	Product* CreateProduct(PRODUCTTYPE type)
	{
		switch (type)
		{
		case TypeA:
			return new ProductA();

		case TypeB:
			return new ProductB();

		case TypeC:
			return new ProductC();

		default:
			return NULL;
		}
	}
};

int main(int argc, char *argv[])
{
	// First, create a factory object
	Factory *ProductFactory = new Factory();
	Product *productObjA = ProductFactory->CreateProduct(TypeA);
	if (productObjA != NULL)
		productObjA->Show();

	Product *productObjB = ProductFactory->CreateProduct(TypeB);
	if (productObjB != NULL)
		productObjB->Show();

	Product *productObjC = ProductFactory->CreateProduct(TypeC);
	if (productObjC != NULL)
		productObjC->Show();

	delete ProductFactory;
	ProductFactory = NULL;

	delete productObjA;
	productObjA = NULL;

	delete productObjB;
	productObjB = NULL;        

	delete productObjC;
	productObjC = NULL;

	return 0;
}

唔,本文链接上说的,需要创建对象很多时,那么其实,工厂的用法就是:用一个单独的类来做这个创造实例的过程(来源于大话设计模式)

那么依我理解,这个ProductFactory就是一个车间,然后里面有三台机器,分别就是生产ProductA、ProductB、ProductC的,我们有了这个工厂,就可以去用这个工厂类去产出这些产品(调用工厂类方法),其实做的事情也就是new一个新的Product。那么你就可以问工厂去拿这些产品,而不需要你直接去工厂里面的机器上拿这些产品了,仔细想一下是有那么点用处的。(未应用于实际,尚未知道好在哪里,暂时这么理解,以后记得补充..)


然后这个简单工厂模式呢,涉及一个很重要的问题,就是实现类的三大特性:封装、继承、多态。

封装:封装起Product类还有三个Product子类

继承:ProductA,ProductB,ProductC继承自Product

多态:子类重写方法

//不如趁机复习一下多态的概念吧:

多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。

C++中,实现多态有以下的方法:虚函数,抽象类,覆盖,模板(重载和多态无关)。




//那么我自己的问题来了:

1.

Q:为什么要封装?直接在main里面实现create不同类型的product不是代码更加少更加方便么?

A:封装就是为了“接口与实现分离”,的确,代码量加大了,但是,程序容易维护了,容易扩展了,容易复用了,简单来说:就是你一看main函数就知道他做了什么,不用仔细去看到底哪些是实现哪些是接口。


2.

Q:为什么那个是switch来选择productA还是B还是C?为什么不用三个if?

A:判断分支,意味着每个条件都要进行判断,等于计算机做了三次无用功。


3.

Q:为什么不全部实现都写在Product里面,那就不用派生出三个子类了啊?

A:根据程杰大大的思想,你老板跟你说ProductC那个生产机器要重新安装,那你就直接要生产机器C就是了,难道你还去问你老板把整个车间的机器都给你看一遍你再去弄机器C吗..  即是说,你到时要增加或者修改一个Product子类,那么直接去  “派生一个子类”  或者  “修改对应子类”  就行了..

这叫做:“降低耦合度(松耦合 && 紧耦合)”

那么来拓展一下知识咯:“什么叫耦合”  

耦合度顾名思义,就是两者之间的密切关系程度,也可以理解为相互依赖程度。


4.

Q:那么什么时候用简单这个模式啊?

A:前面其实已经说过了,不过我自己理解就是经常new那些相似的对象,例如加减乘除4个类对象。(以后有更好理解记得回来改..  我总觉得这样理解不靠谱!)

4


猜你喜欢

转载自blog.csdn.net/qq_16468937/article/details/50958532
今日推荐