多态工厂的实现--工厂方法模式
2015-07-13 19:17
274 查看
工厂方法模式概述
在工厂方法模式中,不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供不同的工厂,系统提供一个与产品等级结构对应的工厂等级结构。工厂方法模式提供一个抽象工厂接口来声明抽象工厂方法,而尤其子类来具体实现工厂方法,创建具体的产品对象。
工厂方法模式结构
工厂模式结构图中包含以下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; }
相关文章推荐
- Android:控件WebView显示网页
- 配置LVS + Keepalived高可用负载均衡集群之图文教程
- JavaScript学习(二)
- The Promise of Deep Learning
- CUDA程序设计(一)
- 【cocos2d-x 3.X自学笔记】[转]Eclipse配置安卓开发环境(解决SDK manager下载慢问题)
- Go1.5 改进摘要
- 如何记住阅读的内容
- 大调整是什么?
- swift Bool和元组(Turple)
- I/O概述和审查操作
- windows下apache+wsgi+web.py环境搭建
- Notepad++
- 我们做产品,不是为了热闹,也不是为了赚钱,要设身处地为你的用户想,才有生命力
- C++中浅拷贝和深拷贝问题
- STM32 __asm bug
- Thread中的run()和start()的区别
- java实现顺序链表
- UI_Singleton(单例传值)
- Two output file names resolved to the same output path