`
runfeel
  • 浏览: 935677 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

1 日志记录器的设计

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

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

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

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

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

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

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

//日志记录器工厂
class LoggerFactory {
    //静态工厂方法
	public static Logger createLogger(String args) {
		if(args.equalsIgnoreCase("db")) {
			//连接数据库,代码省略
			//创建数据库日志记录器对象
			Logger logger = new DatabaseLogger(); 
			//初始化数据库日志记录器,代码省略
			return logger;
		}
		else if(args.equalsIgnoreCase("file")) {
			//创建日志文件
			//创建文件日志记录器对象
			Logger logger = new FileLogger(); 
			//初始化文件日志记录器,代码省略
			return logger;			
		}
		else {
			return null;
		}
	}
}


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

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

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

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

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

分享到:
评论

相关推荐

    design-pattern-java.pdf

    六个创建型模式 简单工厂模式-Simple Factory Pattern 工厂三兄弟之简单工厂模式(一) 工厂三兄弟之简单工厂模式(二) 工厂三兄弟之简单工厂模式(三) 工厂三兄弟之简单工厂模式(四) 工厂方法模式-Factory ...

    Java 设计模式

    - **工厂三兄弟之简单工厂模式**:简单工厂模式通过一个工厂类负责创建所有实例,简化了客户端的使用方式。 2. **工厂方法模式**:定义了一个用于创建对象的接口,但允许子类决定实例化哪一个类。 - **工厂三兄弟...

    设计模式中文版第一部分,英文不太好的兄弟的福音(卷三)

    中文版的设计模式,包括工厂模式、策略模式等,给打家提供设计上的参考。卷三

    design-pattern

    1. **工厂三兄弟之简单工厂模式** - **目的**:通过一个工厂类根据传入的参数决定实例化哪个具体的产品类。 - **优点**:客户端不需要知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可。 - *...

    兄弟一体机DCP-7010-7025维修手册

    《兄弟一体机DCP-7010-7025维修手册》是针对兄弟公司推出的DCP-7010和DCP-7025型号一体机的专业维修指导资料,旨在帮助用户和维修技术人员解决设备在使用过程中可能出现的各种问题。这份手册详细阐述了这两款多功能...

    Delphi最新三层源码

    随便说说最近项目中的三层架构吧。讲点实际的东西。我最讨厌空讲道理。... 呵呵,下次再讲讲业务逻辑方面吧,希望给做DELPHI三层的兄弟一个参考。我的QQ: 11718111 Email: wu_yanan2003@yahoo.com.cn

    JavaScript王者归来part.1 总数2

     6.5.2 模式--函数工厂及其实例   6.6 总结   第7章 对象  7.1 什么是对象   7.2 对象的属性和方法   7.2.1 对象的内置属性   7.2.2 为对象添加和删除属性   7.2.3 反射机制--枚举对象属性   7.3 ...

    【史上最全】【后端】【面试】必背大全.pdf

    设计模式部分可能包括了创建型模式(如工厂模式、单例模式、建造者模式等)、结构型模式(如适配器模式、装饰器模式、代理模式等)、行为型模式(如策略模式、观察者模式、迭代器模式等)的定义、特点、使用场景和...

    复习课_三次科技革命.ppt

    4. **影响**:生产力大幅提高,工业生产模式从手工工场转变为大机器生产,社会结构发生变化,催生了现代工厂制度,推动了全球贸易和殖民扩张,同时也加剧了社会贫富差距。 **第二次科技革命(电力革命)** 1. **...

    数据库系统概论(第三版)课后习题答案.doc

    - 子女-兄弟链接法和层次序列链接法都是用来表示层次数据库中实体间关系的方法。具体存储结构示意图需参考教材中的图形表示。 以上内容覆盖了数据库系统概论第一章中的主要知识点,希望能帮助读者更好地理解和掌握...

    家乡的变化的小学三年级作文400字.pdf

    我的家乡,曾是一片碧波荡漾、绿树成荫的宁静之地。记忆里,春天,燕子兄弟掠过水面,衔泥造窝;夏日,孩子们在河里嬉戏捉鱼;秋风起时,燕子兄弟飞往北方;而冬日,河面结冰,鲤鱼弟弟静卧水底。这样的四季更迭,...

    javaSE代码实例

    12.3.1 静态工厂方法 231 12.3.2 isNaN方法 232 12.3.3 equals方法 233 12.4 自动打包/解包 -235 12.4.1 自动打包 235 12.4.2 自动解包 236 12.5 特殊的数值计算 237 12.5.1 特大整数的计算 237 ...

    九年级历史上册 第七单元 垄断资本主义时代的世界 第20课 人类迈入“电气时代”学案 人教版.doc

    这一时期,电力逐渐取代蒸汽成为工厂机器的主要动力,并广泛应用于生活领域,极大地改善了人们的生活。 2. **电力的应用**:电力的广泛应用包括照明、通信、交通等多个方面,其中,美国科学家爱迪生在1879年发明的...

    数据库概论习题

    11. 对于涉及三个实体的多对多联系,这种联系与实体两两之间的联系在逻辑上并不等价,因为它们表达了不同类型的关联,多对多联系涉及到更复杂的交互模式。 #### 学校、工厂等场景的E-R图设计 12. 设计学校、工厂等...

    (全)传智播客PHP就业班视频完整课程

    9-28 7 给对象指定成员函数 自定义工厂方法 9-30 1 课程回顾 9-30 2 javascript的闭包 js变量作用域 9-30 3 仿超级玛丽兄弟游戏制作 9-30 4 构造方法 对象的常用操作 9-30 5 面向对象的封装 继承 多态 9-30 6 面向...

    韩顺平PHP JS JQUERY 所有视频下载种子 货真价实

    9-28 7 给对象指定成员函数 自定义工厂方法 9-30 1 课程回顾 9-30 2 javascript的闭包 js变量作用域 9-30 3 仿超级玛丽兄弟游戏制作 9-30 4 构造方法 对象的常用操作 9-30 5 面向对象的封装 继承 多态 9-30 6 面向...

    税务规划轻工业品进出口公司出口骗税案.pdf

    C市轻工业品进出口公司采用了一种被称为“四自三不见”的业务模式进行欺诈。该模式允许企业自主选择客户、货源、汇票和自行报关,而不与外商见面、不看货物、不接触工厂。这种模式在缺乏有效的外部监督和内部管理的...

Global site tag (gtag.js) - Google Analytics