简单工厂模式
简单工厂模式是属于创建型模式,但不属于23种GOF设计模式之一。简单工厂模式,是由一个工厂对象决定创建出哪一种产品类的实例。
简单工厂模式种的各种角色:
工厂角色:简单工厂的核心,它负责创建所有实例的内部逻辑,工厂类的创建产品类的实例的方法可以被外界直接调用,创建所需的产品对象
抽象产品角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口
具体产品角色:简单工厂模式所创建的具体实例对象
下面是一个例子:
#include <iostream>
using namespace std;
// 抽象产品角色:水果类
class AbstractFruit
{
public:
virtual void ShowName() = 0;
};
// 具体产品角色:苹果类
class Apple :public AbstractFruit
{
public:
virtual void ShowName()
{
cout << "苹果" << endl;
}
};
// 具体产品角色:香蕉类
class Banana :public AbstractFruit
{
public:
virtual void ShowName()
{
cout << "香蕉" << endl;
};
};
// 具体产品角色:梨类
class Pear :public AbstractFruit
{
public:
virtual void ShowName()
{
cout << "梨" << endl;
};
};
// 工厂角色:水果工厂,不符合开闭原则
class FruitFactory
{
public:
// flag,接收参数,通过参数来判断应该创建什么类型的对象
static AbstractFruit * CreateFruit(string flag)
{
if (flag == "apple")
{
return new Apple(); // 创建苹果类对象
}
else if (flag == "banana")
{
return new Banana();// 创建香蕉类对象
}
else if (flag == "pear")
{
return new Pear(); // 创建梨类对象
}
else
{
return NULL;
}
}
};
void main()
{
// 不需要 关心 创建过程,直接使用
FruitFactory * factory = new FruitFactory;
AbstractFruit * fruit = NULL;
// 创建一个苹果类对象
fruit = factory->CreateFruit("apple");
fruit->ShowName();
delete fruit;
// 创建一个香蕉类对象
fruit = factory->CreateFruit("banana");
fruit->ShowName();
delete fruit;
// 创建一个梨类对象
fruit = factory->CreateFruit("pear");
fruit->ShowName();
delete fruit;
delete factory;
}
运行结果:
简单工厂模式的优缺点:
优点:
1、工厂类是整个模式的关键,根据外界给定的信息来决定到底要创建哪个具体类的对象。
2、外界创建对象时直接传参调用该方法就可以了,不需要关心对象具体是怎么创建的。
3、尤其是在某些对象创建过程比较复杂的情况下,比起直接创建具体产品对象,简单工厂模式更显优势。
缺点:
1、简单工厂模式不符合开闭原则,它增加新的功能是通过修改源代码实现的(比如在添加新的类时,就需要改变工厂类了)。
2、工厂类的职责过重,这个类一旦出现问题,会影响到很多使用这个工厂的模块。
感谢您的浏览。