[置顶] 设计模式学习(三) 工厂模式

接下来学习的是第三种设计模式,我们通常称为工厂设计模式,基本设计方法和简单工厂类设计方式差不多,只是对于简单工厂类违背开闭原则的部分进行了一些改善。

由于上次提到过简单工厂模式(静态工厂模式)的设计方法,那么这里就不再进行介绍了。但是我们应该记得,在工厂类中,我们要实现一个逻辑判断过程,来通过传入的参数判断我们将生产的是哪一种“产品”,判断逻辑如下代码:

	People(string myType)
	{
		this->type = myType;
		switch(this->type)
		{
		case "Student":{
		//初始化学生信息
		}break;
		case "Teacher":{
		//初始化教师信息
		}break;
		case "Other":{
		//初始化其他员工信息
		}break;
		default:break;
		}
	}


那么,很显然如果我们如果要再加入新的分类,那么我们就一定要修改这里的逻辑代码!这违背了我们的开闭原则。我们知道,在简单工厂类中,我们只有一个工厂来完成所有产品的生产;而工厂模式的改进方法则是,使用一个抽象工厂作为接口,然后还要为每一种产品创建不同的工厂。这样做的好处是(1)降低原来工厂类的耦合性,避免一个工厂同时完成太多工作;(2)使得添加新的产品变得更简单。

设计代码如,下其中FactoryA和FactoryB就是为BasicClassA和BasicClassB建立的工厂,Factory类就是一个抽象工厂:

#ifndef CLASS_H
#define CLASS_H

#include <iostream>
using namespace std;

class BasicClass
{
public:
    virtual void Show() = 0;
};
class BasicClassA: public BasicClass
{
public:
	void Show() { cout<<"BasicClass A"<<endl; }
};
class BasicClassB: public BasicClass
{
public:
	void Show() { cout<<"BasicClass B"<<endl; }
};
class Factory
{
public:
	virtual BasicClass* CreateBasicClass() = 0;
};
class FactoryA: public Factory
{
public:
	BasicClassA* CreateBasicClass()
	{
		return new BasicClassA;
	}
};
class FactoryB: public Factory
{
public:
	BasicClassB* CreateBasicClass()
	{
		return new BasicClassB;
	}
};


#endif

相对应的主函数代码(XML::getGonfig()函数是用于在xml中找到相应的项,这样一来添加新的产品只需要添加新的类和在配置文件中加上一项,而不必要修改代码了):


#include <iostream>
#include "class.h"
#include "xml.h"
using namespace std;

int main()
{
	Factory* factory;
	BasicClass* sCore;

	factory = XML::getConfig();

	sCore = factory->CreateBasicClass();
	sCore->Show();
}




最后提一下,在适用对象方面,工厂模式和简单工厂模式还是基本相同的。

你可能感兴趣的:([置顶] 设计模式学习(三) 工厂模式)