`

【转】 设计模式解析笔记—为什么需要工厂

阅读更多
为什么需要工厂?
有两大原因:一是将创建者和使用者解耦,二是提高内聚度。

概念上相似的对象从使用的视角来看,可以以同样的方式处理。然而,创建对象时,负责创建的实体通常需要了解创建的是哪个具体对象,以及何时创建这个而非那个对象。OO告诉我们,让客户对象在概念层次上使用其他对象是最有用的,这意味着设计要遵循开闭原则、依赖倒置原则和Liskov替换原则。要实现这些原则,客户对象就不应知道它所使用的到底是哪一个具体对象。因此,需要有实体来专门负责此事——工厂出现了。

如果让对象的使用者负责实例化该对象,那么代码将会变得复杂。它必须了解许多事情:要创建哪些对象,需要哪些构造参数,构造之后如何使用对象——甚至还包括如何管理一个对象池。将使用和创建分开,将有效提高两部分的内聚度。

什么是工厂
工厂是专门用于实例化其他对象的方法(静态或非静态)、对象或者其他任何实体。工厂可以是专门的对象,也可以是被创建对象自己封装的工厂方法。与工厂有关的经典设计模式有:
Abstract factory
Builder
Factory method
Prototype
Singleton(单线程环境)/doule-checked locking(多线程环境)
Object pool

工厂的职责
1、创建对象。
2、按照预定规则管理对象。比如需创建对象的数量,如何共享对象。

工厂设计准则
先考虑系统中需要什么,然后再去关注如何创建系统。也就是说,我们应该在确定了对象是什么之后再定义工厂。
也可以如下描述:
对象应该要么构造或管理其他对象,要么使用其他对象,而不应该兼而有之。

客户对象与被使用的对象是解耦的,它们不知道被使用对象的具体类型,这些工作是由工厂负责的。另一方面,工厂只知道它们在创建和管理哪些对象,而无需知道这些对象如何使用。
这种分离将带来如下好处:
1、既加强了内聚性,又降低了耦合度。
2、封装了对象的创建过程,具体类对客户对象完全隐藏了。添加新实现或者删除已有实现,都不会改变客户对象。有助于遵循开闭原则。
3、简化测试。客户对象的行为方式和具体实现类无关,这样就无需测试客户对象和具体实现类的所有组合,只需要单独测试各个部分即可。

设计步骤
将开发分为三步:
1、根据所履行的职责找出对象。这时共性和可变性分析极为有用。
2、决定如何使用这些对象。主要是考虑对象间关系,这正是诸多行为型和结构型模式要解决的问题。
3、决定如何管理这些对象,这是工厂的用武之地。
步骤2中生成的代码无需操心哪个对象应该实例化,步骤3的代码则无需操心对象的协作方式。两个步骤的代码内聚性都更好。

添加新功能步骤
1、重构关注点上不符合开闭原则的部分,使之符合开闭原则,并区分出使用者和工厂。
2、编写实现新功能的类。
3、修改管理这些对象的工厂。

工厂和其他模式的结合
模式的结合总是能带来更强大的能力。除了已经well-known的各种工厂之外,可以将行为型和结构型模式组合到工厂中,使得对象创建过程更加灵活,比如可以有使用bridge、decorator或者chain-of-responsibility的工厂。

最后,设计模式在编程实践中都只是指导性的意见。工厂有上面说的那些好处,并不意味着我们一上来就必须用工厂。情况较简单,或者暂时还没有预见到变化的地方,就没有必要用工厂。随着系统越来越复杂,才逐步出现工厂方法,直到专门的工厂对象。

转自http://blog.csdn.net/liudows/article/details/7615968
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics