前段时间比较忙,一直没时间看设计模式,原本计算也被打乱了,只能有空时学习一下,从最简单的简单工厂模式开始吧
1、什么是简单工厂模式
简单工厂模式属于创建型模式,是由一个工厂对象决定创建出哪一类产品类的实例,其实质就是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例
2、实例
下面的代码功能主要是实现一个工厂类,工厂类根据传入的运算符,创建出相应的加法/减法类实例。
首先是创建一个父类运算类:运算类只有两个变量numbeA和numberB,同时构造函数初始化变量值,然后就是一个虚函数,后续由子类实现对应的功能。
//运算类
class Operation
{
public:
double NumberA;
double NumberB;
//构造函数,初始化
Operation()
{
NumberA = 2.0;
NumberB = 1.0;
}
//虚函数
virtual double GetResult()
{
double result = 0;
return result;
}
};
然后创建减法类和加法类,继承运算类,实现加法和减法:
//继承运算类的加法类
class OperationAdd : public Operation
{
double GetResult()
{
double result = 0;
result = NumberA + NumberB;
return result;
}
};
//继承运算类的减法类
class OperationSub : public Operation
{
double GetResult()
{
double result = 0;
result = NumberA - NumberB;
return result;
}
};
最后创建工厂类,完成根据运算符创建对应加法/减法实例
//生成实例的工厂类
class OperationFactory
{
public:
static Operation* CreateOperate(char operate)
{
Operation * oper = NULL;
switch(operate)
{
case '+':
oper = new OperationAdd();
break;
case '-':
oper = new OperationSub();
}
return oper;
}
};
客户端代码为
//客户端
int main()
{
//工厂类对象指针
OperationFactory* factoryA = new OperationFactory();
double resultAdd = 0;
double resultSub = 0;
//传入运算符'-'
char operate = '-';
resultSub = factoryA->CreateOperate(operate)->GetResult();
//传入运算符'+'
operate = '+';
resultAdd = factoryA->CreateOperate(operate)->GetResult();
cout << resultAdd << " "<< resultSub <<endl; //结果为3 1
getchar();
return 0;
}
3、优缺点
这是一个很好理解的工厂模式实例,工厂模式很好地将业务和界面分离开,如果需要增加其他运算如乘法、除法、开方、平方等运算,只需要增加相应的乘法类、除法类等等,同时在工程类的分支中加入对应类的实例创建分支,对于客户端来讲,业务逻辑是不可见的。但同样也有一定的缺点,由于所有的运算子类实例创建都在一个工厂类中,违背了高内聚原则,如果需要增加其他类,那么必须要改动工厂类的内部实现,并且虽则功能的不断增多,子类增加,判断也增加对系统的维护和扩展不利。