设计模式学习(三) 工厂模式

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

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

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




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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值