浅学一下【设计模式】
第二个练习:工厂模式
简单工厂模式似乎已经很方便了,但是我们需要思考像这样一种情况:下面的这样一个图表工厂类,目前可以创建柱状图、饼图和折线图,但是当我们需要添加新的图表类,比如频率直方图类时,那我们就需要在ChartFactory中添加下列代码:
class ChartFactory
{
public:
static Chart* getChart(const string& type)
{
Chart* chart = nullptr;
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;
}
else if (type == "frequency_histogram")
{
chart = new FrequencyHistogramChart();
cout << "初始化设置折线图!" << endl;
}
return chart;
}
};
而我们知道,这样子就修改了工厂类的源代码,违背了我们最开始提到的“开闭原则”,那么,有没有一种设计是当我们增添新产品时可以做到无需修改原来的代码呢?所以,就出现了一个新东西 ——工厂方法模式。
鉴于两者是具有一些差别,我们先从这个例子来感受一下,他们的设计有什么不同之处。
举个栗子
代码实现:
#include<iostream>
using namespace std;
class Logger//日志类
{
public:
virtual void writeLog() = 0;//创建日志方法
};
class FileLogger :public Logger//文件日志类
{
public:
void writeLog()
{
cout << "文件日志写入....." << endl;
}
};
class DatabaseLogger :public Logger//数据库日志类
{
public:
void writeLog()
{
cout << "数据库日志写入....." << endl;
}
};
class LoggerFactory//日志工厂
{
public:
virtual Logger* CreateLogger() = 0;
};
class DatabaseLoggerFactory :public LoggerFactory//数据库日志工厂
{
public:
Logger* CreateLogger()
{
Logger* logger = new DatabaseLogger();
return logger;
}
};
class FileLoggerFactory :public LoggerFactory//文件日志工厂
{
public:
Logger* CreateLogger()
{
Logger* logger = new FileLogger();
return logger;
}
};
进行测试:
int main()
{
LoggerFactory* factory=NULL;
Logger* logger=NULL;
factory = new DatabaseLoggerFactory();
logger = factory->CreateLogger();
logger->writeLog();
return 0;
}
总结
从这个例子来看,我们大概可以知道简单工厂模式和工厂模式 的区别,就在于将工厂类变为抽象工厂类,而增添了具体产品的工厂类,他们继承与抽象工厂类,实现了抽象工厂类中定义的方法,经由客户端调用,返回一个具体产品的实例。(抽象工厂可以是接口,也可以是抽象类或者具体类)