工厂三兄弟之工厂方法模式(一)

转载 2013年12月05日 20:17:16

文章转载:http://blog.csdn.net/lovelion/article/details/9306457


 简单工厂模式虽然简单,但存在一个很严重的问题。当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背“开闭原则”,如何实现增加新产品而不影响已有代码?工厂方法模式应运而生,本文将介绍第二种工厂模式——工厂方法模式。

 

1 日志记录器的设计

       Sunny软件公司欲开发一个系统运行日志记录器(Logger),该记录器可以通过多种途径保存系统的运行日志,如通过文件记录或数据库记录,用户可以通过修改配置文件灵活地更换日志记录方式。在设计各类日志记录器时,Sunny公司的开发人员发现需要对日志记录器进行一些初始化工作,初始化参数的设置过程较为复杂,而且某些参数的设置有严格的先后次序,否则可能会发生记录失败。如何封装记录器的初始化过程并保证多种记录器切换的灵活性是Sunny公司开发人员面临的一个难题。

       Sunny公司的开发人员通过对该需求进行分析,发现该日志记录器有两个设计要点:

       (1) 需要封装日志记录器的初始化过程,这些初始化工作较为复杂,例如需要初始化其他相关的类,还有可能需要读取配置文件(例如连接数据库或创建文件),导致代码较长,如果将它们都写在构造函数中,会导致构造函数庞大,不利于代码的修改和维护;

       (2) 用户可能需要更换日志记录方式,在客户端代码中需要提供一种灵活的方式来选择日志记录器,尽量在不修改源代码的基础上更换或者增加日志记录方式。

       Sunny公司开发人员最初使用简单工厂模式对日志记录器进行了设计,初始结构如图1所示:

 

基于简单工厂模式设计的日志记录器结构图

       在图1中,LoggerFactory充当创建日志记录器的工厂,提供了工厂方法createLogger()用于创建日志记录器,Logger是抽象日志记录器接口,其子类为具体日志记录器。其中,工厂类LoggerFactory代码片段如下所示:

[java] view plaincopy
  1. //日志记录器工厂  
  2. class LoggerFactory {  
  3.     //静态工厂方法  
  4.     public static Logger createLogger(String args) {  
  5.         if(args.equalsIgnoreCase("db")) {  
  6.             //连接数据库,代码省略  
  7.             //创建数据库日志记录器对象  
  8.             Logger logger = new DatabaseLogger();   
  9.             //初始化数据库日志记录器,代码省略  
  10.             return logger;  
  11.         }  
  12.         else if(args.equalsIgnoreCase("file")) {  
  13.             //创建日志文件  
  14.             //创建文件日志记录器对象  
  15.             Logger logger = new FileLogger();   
  16.             //初始化文件日志记录器,代码省略  
  17.             return logger;            
  18.         }  
  19.         else {  
  20.             return null;  
  21.         }  
  22.     }  
  23. }  


       为了突出设计重点,我们对上述代码进行了简化,省略了具体日志记录器类的初始化代码。在LoggerFactory类中提供了静态工厂方法createLogger(),用于根据所传入的参数创建各种不同类型的日志记录器。通过使用简单工厂模式,我们将日志记录器对象的创建和使用分离,客户端只需使用由工厂类创建的日志记录器对象即可,无须关心对象的创建过程,但是我们发现,虽然简单工厂模式实现了对象的创建和使用分离,但是仍然存在如下两个问题:

       (1) 工厂类过于庞大,包含了大量的if…else…代码,导致维护和测试难度增大;

       (2) 系统扩展不灵活,如果增加新类型的日志记录器,必须修改静态工厂方法的业务逻辑,违反了“开闭原则”。

       如何解决这两个问题,提供一种简单工厂模式的改进方案?这就是本文所介绍的工厂方法模式的动机之一。

 

【作者:刘伟 http://blog.csdn.net/lovelion


相关文章推荐

工厂三兄弟之工厂方法模式(四)

5 重载的工厂方法       Sunny公司开发人员通过进一步分析,发现可以通过多种方式来初始化日志记录器,例如可以为各种日志记录器提供默认实现;还可以为数据库日志记录器提供数据库连接字符串,为文件...
  • LoveLion
  • LoveLion
  • 2013年07月12日 11:00
  • 13081

工厂三兄弟之工厂方法模式(四):重载,隐藏,总结

5 重载的工厂方法Sunny公司开发人员通过进一步分析,发现可以通过多种方式来初始化日志记录器,例如可以为各种日志记录器提供默认实现;还可以为数据库日志记录器提供数据库连接字符串,为文件日志记录器提供...
  • will130
  • will130
  • 2016年01月03日 23:27
  • 179

工厂三兄弟——工厂方法模式

什么是工厂方法模式在简单工厂模式中只提供一个工厂类,该工厂类处于对产品类进行实例化的中心位置,它需要知道每一个产品对象的创建细节,并决定何时实例化哪一个产品类。简单工厂模式最大的缺点是当有新产品要加入...
  • Todo_
  • Todo_
  • 2016年02月17日 11:45
  • 395

工厂三兄弟之工厂方法模式

简单工厂模式虽然简单,但存在一个很严重的问题。当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背“开闭原则”,如何实现增加新产品而不影响...

工厂方法模式.ppt

  • 2014年08月14日 20:45
  • 318KB
  • 下载

工厂方法模式源文件

  • 2015年04月27日 10:24
  • 17KB
  • 下载

9、Cocos2dx 3.0游戏开发找小三之工厂方法模式与对象传值

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27693365 工厂方法模式 工厂方法是程序设计中...

C# 2048 工厂方法模式

  • 2015年09月16日 20:18
  • 555KB
  • 下载

工厂方法模式

  • 2014年01月12日 21:39
  • 588KB
  • 下载

三、工厂方法模式

工厂方法模式工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。你应该大致猜出了工厂方法模式的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:工厂三兄弟之工厂方法模式(一)
举报原因:
原因补充:

(最多只允许输入30个字)