简单工厂模式
简单工厂模式概述
首先将需要创建的各种不同对象的相关代码封装到不同的类中,这些类称为具体产品类,而将它们公共的代码进行抽象和提取后封装在一个抽象产品类中,每一个具体产品类都是抽象产品类的子类,然后提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方法,该方法可以根据所传入的参数不同创建不同的具体产品对象;客户端只需要调用工厂类的工厂方法并传入相应的参数即可得到一个产品对象
例子
需求:图标库的设计
软件公司欲给予C++语言开发一套图表库,该图表库可以为应用系统提供各种不同外观的图表,例如柱状图,饼状图,折线图等;软件公司图表库设计人员希望为应用系统开发人员提供一套灵活易用的图表库,而且可以较为方便地对图表库进行扩展,以便能够在将来增加一些新类型的图表
//抽象产品类
struct Chart
{
virtual void display() = 0;
};
class HistogramChart : public Chart
{
public:
HistogramChart()
{
cout << "创建柱状图" << endl;
}
void display()
{
cout << "显示柱状图" << endl;
}
};
class PieChart : public Chart
{
public:
PieChart()
{
cout << "创建饼状图" << endl;
}
void display()
{
cout << "显示饼状图" << endl;
}
};
class LineChart : public Chart
{
public:
LineChart()
{
cout << "创建折线图" << endl;
}
void display()
{
cout << "显示折线图" << endl;
}
};
class ChartFactory
{
public:
static Chart* getChart(const string& type)
{
Chart* chart = NULL;
if (type == "histogram")
{
chart = new HistogramChart();
cout << "初始化设置柱状图" << endl;
}
else if(type == "pie")
{
chart = new PieChart();
cout << "初始化设置饼状图" << endl;
}
else if (type == "line")
{
chart = new LineChart();
cout << "初始化设置折线图" << endl;
}
}
};
int main()
{
Chart* chart = NULL;
chart = ChartFactory::getChart("line");
chart->display();
return 0;
}
在工厂模式下,即使我们需要添加新的不同图表,也可以简单方便的进行添加
简单工厂模式总结
简单工厂模式提供了专门的工厂类用于创建对象,将对象的创建和对象的使用分离开,它作为一种最简单的工厂模式在软件开发中得到了较为广泛的应用
- 优点
简单工厂模式的主要优点如下:
- 工厂类包含必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的职责,而仅仅“消费”产品,简单工厂模式实现了对象创建和使用的分离
- 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以在一定程度减少使用者的记忆量
- 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性
- 缺点
简单工厂模式的主要缺点如下:
- 由于工厂类集中了所有产品的创建逻辑,职责过重,一旦不饿能正常工作,整个系统都要受到影响
- 使用简单工厂模式势必会增加系统中类的个数(引入新的工程类),增加了系统的复杂度和理解难度
- 系统拓展困难,一旦添加了新的产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的拓展和维护
- 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构
- 使用场景
在以下情况下可以考虑使用简单工厂模式:
- 工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂
- 客户端只知道传入工厂类的参数,对于如何创建对象并不关心