简单工厂模式又叫做静态工厂方法模式。它的核心思想就是用一个工厂,根据输入的条件不同,从而产生不同的类,然后根据不同类的virtual函数得到不同的结果,这就理所当然的要求被创建的实例要具有共同的父类。
优点:工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。
缺点:简单工厂模式违背了“开放封闭原则”,即违背了“系统对扩展开放,对修改关闭”的原则,因为当我新增加一个产品的时候必须修改工厂类。
类图如下:
示例代码如下,如果此时新增一种水果,除了要增加一个具体水果类外,还必须将Factory类中的creatFruit函数进行修改,多加一条判断语句,所以违反了开闭原则。:
#include<iostream>
using namespace std;
/* 抽象水果类 */
class Fruit
{
public:
virtual void getName() = 0;
};
/* 具体香蕉类 */
class Banana :public Fruit
{
public:
virtual void getName()
{
cout << "我是香蕉..." << endl;
}
};
/* 具体苹果类 */
class Apple :public Fruit
{
public:
virtual void getName()
{
cout << "我是苹果..." << endl;
}
};
/* 具体工厂类 */
class Factory
{
public:
/* 根据输入不同,产生不同的具体产品类 */
Fruit* creatFruit(const char* p )
{
if (0 == strcmp(p, "banana"))
{
return new Banana;
}
else if (0 == strcmp(p, "apple"))
{
return new Apple;
}
else
{
cout << "没有这种水果:" << p << endl;
return NULL;
}
}
};
int main()
{
Factory* f = new Factory;
Fruit* fruit = f->creatFruit("apple");
if (fruit)
{
fruit->getName();
delete fruit;
}
fruit = f->creatFruit("banana");
if (fruit)
{
fruit->getName();
delete fruit;
}
fruit = f->creatFruit("人参果");
if (fruit)
{
fruit->getName();
delete fruit;
}
delete f;
system("pause");
return 0;
}
运行结果如下: