接下来学习的是第三种设计模式,我们通常称为工厂设计模式,基本设计方法和简单工厂类设计方式差不多,只是对于简单工厂类违背开闭原则的部分进行了一些改善。
由于上次提到过简单工厂模式(静态工厂模式)的设计方法,那么这里就不再进行介绍了。但是我们应该记得,在工厂类中,我们要实现一个逻辑判断过程,来通过传入的参数判断我们将生产的是哪一种“产品”,判断逻辑如下代码:
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();
}