码迷,mamicode.com
首页 > 其他好文 > 详细

工厂方法模式

时间:2015-07-13 20:44:22      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:

工厂方法模式概述


在工厂方法模式中,不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供不同的工厂,系统提供一个与产品等级结构对应的工厂等级结构。
工厂方法模式提供一个抽象工厂接口来声明抽象工厂方法,而尤其子类来具体实现工厂方法,创建具体的产品对象。

工厂方法模式结构


技术分享

工厂模式结构图中包含以下4个角色。
(1) 抽象产品:它是定义产品的接口,是工厂方法模式所创建对象的超类型。
(2)具体产品: 它实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,具体工厂与具体产品之间一一对应。
(3)抽象工厂:在抽象工厂类中,声明了工厂方法,用于返回产品。抽象工厂是工厂方法模式的核心,所有创建对象的工厂类都必须实现该接口。
(4)具体工厂:它是抽象工厂的子类,实现了抽象工厂中定义的工厂方法,并可由客户端调用,返回一个具体产品类。
与简单工厂模式比较,工厂方法模式最重要的区别是引入了抽象工厂角色。

重载的工厂方法


可以提供一组重载的工厂方法,以不同的方式对产品对象进行创建。当然,对于同一个具体工厂而言,无论使用哪个重载的工厂方法,创建的产品类型均要相同。

工厂方法的隐藏


在工厂类中,直接调用产品类的业务方法,客户端无需调用工厂方法创建产品,直接通过工厂即可使用所创建的对象中的业务方法。
抽象工厂类LoggerFactory代码示例如下:
abstract class LoggerFactory{
	public void writeLog(){
		Logger logger=this.createLogger();
		logger.writeLog();
	}
	public abstract LoggerFactory createLogger();
}


工厂方法模式总结

主要优点


1.在系统中加入新产品时,无需修改抽象工厂和抽象产品提供的接口,无需修改客户端,也无需修改其他的具体产品和具体工厂,而只要添加一个具体工厂和一个具体产品即可,系统可扩展性号,符合开闭原则。

主要缺点

1.添加新产品时,需要添加新的具体产品类和具体工厂,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,给系统带来了一些额外的开销。

适用场景

1.抽象工厂类通过其子类来指定创建哪个对象。

工厂方法模式的应用实例

日志记录器的设计
技术分享

代码示例如下:
#include <iostream>
using namespace std;
//日记记录器接口:抽象产品
class Logger{
public:
	virtual void writeLog()=0;
};

//数据库日志记录器
class DatabaseLogger:public Logger{
public:
	void writeLog(){
		cout<<"数据库日志记录器"<<endl;
	}
};

//文件日志记录器:具体产品
class FileLogger:public Logger{
public:
	void writeLog(){
		cout<<"文件日志记录器"<<endl;
	}
};

//日志记录器工厂接口:抽象工厂
class LoggerFactory{
public:
	virtual Logger* createLogger()=0;
};

//数据库日志记录器工厂类:具体工厂
class DatabaseLoggerFactory:public LoggerFactory{
public:
	Logger* createLogger(){
		return new DatabaseLogger();
	}
};

//文件日志记录器工厂类:具体工厂
class FileLoggerFactory:public LoggerFactory{
public:
	Logger* createLogger(){
		return new FileLogger();
	}
};

//客户端测试代码

int main(){
	LoggerFactory *loggerFactory=new DatabaseLoggerFactory();
	Logger *logger=loggerFactory->createLogger();
	logger->writeLog();
	return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

工厂方法模式

标签:

原文地址:http://blog.csdn.net/sxhlovehmm/article/details/46864821

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!