`

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

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

概念上相似的对象从使用的视角来看,可以以同样的方式处理。然而,创建对象时,负责创建的实体通常需要了解创建的是哪个具体对象,以及何时创建这个而非那个对象。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
分享到:
评论

相关推荐

    HeadFirst设计模式学习笔记

    这份笔记涵盖了13个关键的设计模式,下面将对这些模式进行逐一解析。 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。这种模式在需要控制资源的共享,如数据库连接池、线程池等场景中十分常见。 2. ...

    韩顺平_java设计模式笔记

    解释器设计模式用于构建解析表达式的系统,例如Spring框架中的SpelExpressionParser就使用了这一模式,它能解析表达式并执行计算。UML类图通常包含抽象表达式类、终结符表达式类和非终结符表达式类等角色。 单例...

    韩顺平_Java设计模式笔记.docx

    通过以上内容,我们可以看到韩顺平老师的Java设计模式笔记涵盖了设计模式的基础概念、常见面试题解析、设计原则等内容,并通过具体案例来阐述设计模式的实际应用价值,旨在帮助学习者深刻理解并掌握设计模式,从而在...

    23种设计模式学习笔记

    这个“23种设计模式学习笔记”文档将引导你深入理解这些模式,并帮助你在实际编程中有效地应用它们。以下是对23种设计模式的详细解读: 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。它常用于控制...

    23种设计模式的解析与Cpp实现

    本资源“23种设计模式的解析与Cpp实现”详细介绍了这一主题,包括每种设计模式的基本概念、作用、实现方式以及如何在实际项目中应用。 1. **创建型模式**(Creational Patterns):这类模式主要关注对象的创建,...

    设计模式的读书总结笔记

    这篇“设计模式的读书总结笔记”是对设计模式深入理解和应用的结晶,包含对各种模式的实例解析、优缺点分析以及如何在实际项目中应用的指导。 一、设计模式的基本概念 设计模式并不直接提供代码实现,而是描述在...

    设计模式总结笔记设计模式总结笔记

    ### 设计模式总结笔记 #### 一、概述 设计模式是一种在特定上下文中解决软件设计问题的方案。它并不是一种现成的代码片段或者框架,而是一种指导思想,帮助开发者理解如何更好地组织代码来解决问题。设计模式可以...

    java设计模式源码和笔记(第一部分)

    本资料包“java设计模式源码和笔记(第一部分)”提供了对Java设计模式的深入理解和实践。其中包含了个人的学习笔记和Eclipse环境下实现的源码,方便读者导入后直接运行,进行实践操作。 1. **单例模式**:确保一个...

    图解Java设计模式笔记总结word版本.rar

    本资料“图解Java设计模式笔记总结word版本”聚焦于通过图文并茂的方式,深入浅出地解析各种设计模式。以下是基于这个主题的详细知识点讲解: 1. **设计模式的分类** - **创建型模式**:如单例(Singleton)、工厂...

    设计模式 笔记(附带代码)

    下面将对标题中提到的一些设计模式进行详细介绍,并结合代码示例进行解析。 1. **装饰者模式(Decorator)**: 装饰者模式是一种结构型设计模式,允许在运行时给对象添加新的行为或责任。它通过创建一个包装对象,...

    Android源码设计模式解析与实战

    《Android源码设计模式解析与实战》是一本深入探讨Android系统源码中设计模式应用的书籍,对于Android开发者来说,它是一份极具价值的学习资源。本书不仅理论与实践相结合,而且还提供了丰富的示例代码(demo),...

    《Hear First设计模式》阅读笔记

    第一章可能介绍了设计模式的基本概念,包括模式的定义、分类以及为什么要在软件开发中使用设计模式。作者可能讨论了设计模式如何提高代码的可读性、可维护性和可扩展性。 第二章可能涉及了创建型模式,如工厂模式、...

    设计模式笔记(包含所有设计模式)个人总结提炼笔记

    设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的成熟解决方案。设计模式可以被看作是经验丰富的开发人员在长期实践中总结出的最佳实践,旨在提高软件的可读性、可维护性和可扩展性。设计...

    设计模式中的工厂模式学习

    在《设计模式学习笔记之工厂模式.doc》中,可能会详细解析工厂模式的定义、结构、优缺点、适用场景以及具体代码实现。文档可能会通过实例演示如何在实际项目中应用工厂模式,例如创建数据库连接、构建GUI组件等。...

    研磨设计模式[书签]

    这本书为读者提供了全面而详细的设计模式解析,帮助开发者提升代码质量和可维护性。 设计模式分为三类:创建型、结构型和行为型。创建型模式主要关注对象的创建过程,如单例模式、工厂方法模式和抽象工厂模式等,...

    软件设计师软考笔记.zip

    总之,《软件设计师软考笔记》压缩包为考生提供了一套全面的学习资料,涵盖了软考软件设计师所需的知识点,结合博主的笔记和设计模式表格,相信能有效助力考生顺利通过考试,成为一名合格的软件设计师。

    设计模式教程+笔记(精华版)

    本教程旨在深入解析设计模式的核心概念,并提供实用的指导,帮助开发者更好地理解和应用这些模式。 在设计模式的世界里,我们可以将它们分为三类:创建型模式、结构型模式和行为型模式。创建型模式关注对象的创建,...

    java23种设计模式,3套视频加1个ppt

    在《Java之23种设计模式解析_尚硅谷_宋红康.pdf》中,可能会详细讲解每种设计模式的原理、应用场景、优缺点以及如何在实际项目中应用。视频教程则可能通过示例代码进一步解释这些模式,帮助学习者更好地理解和掌握。...

    最新设计模式超级详解+Tomcat架构源码分析+Spring源码分析 资深级设计模型课程

    ├─day01-总览设计模式-02-创建型模式-为什么使用创建型模式.mp4 ├─day01-总览设计模式-03-创建型模式-单例的演示.mp4 ├─day01-总览设计模式-04-创建型模式-单例的应用场景.mp4 ├─day01-总览设计模式-05-创建...

Global site tag (gtag.js) - Google Analytics