浅学一下【设计模式】之 [ 工厂模式 ]

24 篇文章 2 订阅
4 篇文章 0 订阅

浅学一下【设计模式】

第二个练习:工厂模式

简单工厂模式似乎已经很方便了,但是我们需要思考像这样一种情况:下面的这样一个图表工厂类,目前可以创建柱状图、饼图和折线图,但是当我们需要添加新的图表类,比如频率直方图类时,那我们就需要在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;
}

总结

从这个例子来看,我们大概可以知道简单工厂模式和工厂模式 的区别,就在于将工厂类变为抽象工厂类,而增添了具体产品的工厂类,他们继承与抽象工厂类,实现了抽象工厂类中定义的方法,经由客户端调用,返回一个具体产品的实例。(抽象工厂可以是接口,也可以是抽象类或者具体类)
工厂模式主要角色

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值