Factory Method Pattern

Factory Method Pattern

 

        factory method pattern 是一种对象创建型模式,通常用于将对象的创建与使用进行解耦,使得对象的使用方式不依赖对象的创建方式。下面使用一个日志应用说明factory method pattern 。

 

        日志应用是软件系统中比较常见一种功能,实现该功能也比较简单,例如:

 

        以上代码实现了一个简单的控制台日志功能,怎么样实现一个控制台日志应用够简单吧! :)大牛们多多包含!

 

        以上日志实现是非常简单的,但是真实环境下日志应用不是如此的简单,应用可能要求想多种消息接受目标系统发送日志消息,例如,文件系统、数据库系统或者只是简单的抛弃该日志消息,就像是消息发送到linux下的/dev/null设备文件一样。这种时候一种简单的常规的实现如下:

该代码实现了想多种消息接受目标系统发送日志消息 ,似乎该日志应用非常之强啊。但是我们来想一想下面2个问题:

  • 如果以后增减新的消息接受目标系统是该怎么做?
  • 如果应用初期系统中的日志消息都是发送到文件系统,现在要求发送到数据库,对系统有什么影响?

      在回答以上两个问题之前,我们先来看看增加一个控制台日志应用,Logger类有什么变化。

 

 

      在添加控制台日志应用之后,我们可以发现代码中有三处被修改了,其一是添加了常用CONSOLE_LOG,其二是增减了一个方法writeConsoleLog,其三是修改了log方法中的switch语句。

 

      现在我们回答第一个问题,为了增加一个消息接受目标系统,我们改动了Logger类的三处代码,这样有什么问题呢?如果我们需要在怎么一个将日志消息发送到远程日志服务器,那么对Logger作出相似的改动,此时存在以下2个问题:

 

  • 违背了开闭原则。
  • 产生大量相似代码。

   现在我们来回答第二个问题,显然如果修改代码就违背了开闭原则,其次需要修改代码就是存在变化,而这个变化将引起系统内多个部分被修改,因该被封装起来。

 

      吼!!!,怎么办呢? 别急!!!,有了问题才好啊,求助超人!!!超人也不行啊,哈哈这个是后就得GOF来帮忙了,

 

模式名:factory method pattern

   意图:定义一个用户创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类 。

结构图:

 

 

 

 

      现在,我们用factory method pattern 对Logger类进行重构。

 

      首先,既然为了添加新的消息接受系统,需要添加相似的代码,那么就可以将相似的代码提取出来形成一个继承体系结构。结构图如下:

 

 

 

 

 

 

 

 

 

 

      完成以上工作,我们来看看,怎样使用这些类:

 

 

 

 

       由以上代码可以看出,虽然我们提取一个继承结构出来,但是还没能够消除违背开闭原则的问题,因为如果我们要在不同的接受系统之间替换时,就不可避免的要修改代码。那么要怎样消除这些问题呢?以上代码,我们使用的只是factory method pattern的一部分,也就是“Prohuct”部分,要想解决以上问题,我们必须将对象的创建和使用解耦。使得对象的使用不依赖于其创建。因此我们需要对对象的创建过程进行抽象,使得对象的使用和创建分离。由此我们的得到完整的结构图。

 

 

 

下面我们来看看具体实现:

 

 

 

 

 

 

 

 

       我们来看一下怎么使用这些类:

 

 

 

      咋一看!好像跟LogTester类没有太大的区别,反而怎家代码的复杂度,引入LogFactory的主要目的是将对象的创建过程使得对象的使用与创建分离,来达到解耦的目的。但是解耦的目的达到了,代码也没有违背开闭原则,需要增加新的日志消息接受系统,是要实现Log和LogFactory接口就可以了。但是我们的代码如要在多个日志消息接受系统之间替换的话,就不免要修改代码,这种修改或许是大量的,也是不可忍受的。这也是factory method pattern 的缺点。怎么样来避免这种缺点呢?

 

      我们将使用java反射来解决factory method pattern 引入的新的依赖问题。在Log应用中引入一个config.properties文件,在其中加入

LogTargetSystemClass 属性。修改LogFacotry的实现,如一下结构图所示:

 

 

 

代码实现如下:

 

 

 

 

对LogFactory作出更改以后,我们完美地解决了最后的依赖问题,现在如果在应用中使用我们的日志应用,将是非常爽的。完全可重用,可扩展的日志系统哦,yes!!!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值