Design Pattern (1) 设计模式(1) Institute of Computer Software 2018/11/23 Nanjing University 2018/11/23
摘要 Agile Design Design Patterns design principles Why, What, How Creational, Structural and Behavioral Patterns Institute of Computer Software Nanjing University 2018/11/23
Design Principles SRP 单一职责原则 OCP 开放-封闭原则 LSP Liskov(里氏)替换原则 DIP 依赖倒置原则 ISP 接口隔离原则 CARP (Composition/Aggregation Reuse Principle ) 合成/聚合复用原则 LoD (Law of Demeter) 迪米特法则 Institute of Computer Software Nanjing University 2018/11/23
CARP Composition(合成) vs. Aggregation(聚合) 聚合表示“拥有”关系或者整体与部分的关系 合成是一种强得多的“拥有”关系——部分和整体的 生命周期是一样的。 换句话说:合成是值的聚合(Aggregation by Value ),而一般说的聚合是引用的聚合(Aggregation by Reference) Institute of Computer Software Nanjing University 2018/11/23
复用 复用的基本种类 合成/聚合复用:将已有对象纳入到新对象中,使 之成为新对象的一部分。 继承 Institute of Computer Software Nanjing University 2018/11/23
复用 继承的优点: 继承的缺点: 新类易实现 易修改或扩展 继承复用破环包装,白箱复用. 超类发生变化,子类不得不改变. 继承的实现是静态的,不能在运行时改变. Institute of Computer Software Nanjing University 2018/11/23
复用 合成/聚合的优点 缺点:系统中会有较多的对象需要管理 新对象存取成分对象的唯一方法是通过成分对象的接口。 黑箱复用,因为成分对象的内部细节是新对象所看不见的。 支持包装。 所需的依赖较少。 每一个新的类可以将焦点集中在一个任务上。 这种复用可以在运行时间内动态进行,新对象可以动态的引用与 成分对象类型相同的对象。 作为复用手段可以应用到几乎任何环境中去。 缺点:系统中会有较多的对象需要管理 Institute of Computer Software Nanjing University 2018/11/23
复用 优先使用对象合成/聚合,而不是继承 利用合成/聚合可以在运行时动态配置组件的功 能,并防止类层次规模的爆炸性增长 区分HAS-A 和 IS-A Institute of Computer Software Nanjing University 2018/11/23
复用 Coad法则:什么时候使用继承作为复用的工具 只有当以下Coad条件都满足时才应当使用继承 子类是超类的一个特殊种类,而不是超类的一个角色,也就是区 分“Has-A”和“Is-A”。只有“Is-A”关系才符合继承关系,“Has-A” 关系应当用聚合来描述。 永远不会出现需要将子类换成另外一个类的子类的情况。如果不 能肯定将来是否会变成另外一个子类的话,就不要使用继承。 子类具有扩展超类的责任,而不是具有置换调(override)或注销 掉(Nullify)超类的责任。如果一个子类需要大量的置换掉超类的 行为,那么这个类就不应该是这个超类的子类。 只有在分类学角度上有意义时,才可以使用继承。不要从工具类 继承。 Institute of Computer Software Nanjing University 2018/11/23
LoD 别名:Least Knowledge Principle 最少知识原则 表述: 只与你直接的朋友们通信 Only talk to your immediate friends 不要跟陌生人说话 Don's talk to strangers 每一个软件单位对其他的单位都只有最少的知识,而且局限 于那些与本单位密切相关的软件单位。 Institute of Computer Software Nanjing University 2018/11/23
LoD LoD的实质是控制对象之间的信息流量,流向及信 息的影响 -- 信息隐藏 在类的划分上,应当创建有弱耦合的类。类之间的耦合 越弱,就越有利于复用。 在类的结构设计上,每一个类都应当尽量降低成员的访 问权限。一个类不应当public自己的属性,而应当提供 取值和赋值的方法让外界间接访问自己的属性。 在类的设计上,只要有可能,一个类应当设计成不变类。 在对其它对象的引用上,一个类对其它对象的引用应该 降到最低。 Institute of Computer Software Nanjing University 2018/11/23
OO设计目标与原则 可扩展性 (OCP, LSP, DIP, CARP) 灵活性 (OCP, LoD, ISP) 可插入性 (OCP, LSP, CARP, DIP) Institute of Computer Software Nanjing University 2018/11/23
Principle vs. Pattern 模式都最大化的遵循这些原则 通过原则、策略“推导”出模式 Institute of Computer Software Nanjing University 2018/11/23
Design Patterns: Why? 直接目的:满足对优秀、简单而且可重用的解 决方案的需要。 更进一步: 掌握解决反复出现的问题的办法; 沟通的手段(设计词汇;文档) 更进一步: 从这些实践证明是成功的设计中学习“设计” 反复阅读; 反复应用; 反复揣摩。 Institute of Computer Software Nanjing University 2018/11/23
模式是某外在环境下,对特定问题的惯用解决方案 Design Patterns: What? Christopher Alexander 《A Pattern Language》: "Each pattern describes a problem which occurs over and over again in our environment, and then describes the core of the solution to that problem, in such a way that you can use this solution a million times over, without ever doing it the same way twice" 模式是某外在环境下,对特定问题的惯用解决方案 本质上是设计经验的文档化 Institute of Computer Software Nanjing University 2018/11/23
Design Patterns: What? In the book “Design Patterns”, the design patterns are descriptions of communicating objects and classes that are customized to solve a general design problem in a particular context. Design patterns represent solutions to problems that arise when developing software within a particular context Institute of Computer Software Nanjing University 2018/11/23 16
About Patterns Documentation of expert software engineers' "behavior" Documentation of specific reoccurring problems (and solutions) Abstraction of common design occurrences Institute of Computer Software Nanjing University 2018/11/23
Properties of Design Patterns A pattern addresses a recurring design problem that arises in specific design situations, and presents a solution to it. Patterns document existing, well-proven design experience. Patterns provide a common vocabulary and understanding for design principles. Patterns are a means of documenting software architectures. Patterns support the construction of software with define properties. Patterns help you to manage software complexity. Institute of Computer Software Nanjing University 2018/11/23
SmallTalk: MVC Separation of concern! Model-View-Controller (MVC) [Krasner and Pope,1988] Model: 应用领域有关的类、对象、数据结构以及企业的业务逻辑等; View: 窗口画面,负责将Model的实现呈现给用户; Controller: 监控用户传来的信息,并根据信息指挥,协调Model与View的合作。 Controller View Model Separation of concern! Institute of Computer Software Nanjing University 2018/11/23
Design Patterns Gamma, Erich, R. Helm, R. Johnson, and J. Vlissides. Design patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, 1994. Elisabeth Freeman, Eric Freeman, Bert Bates, Kathy Sierra. Head First Design Patterns, O'Reilly Media, 2004. GoF 2005 Jolt Awards Institute of Computer Software Nanjing University 2018/11/23
Essential elements Pattern name Problem Solution Consequences Name, Classification, Intent (意图), Also known as (别名) Problem Motivation (动机), Applicability (适用性) Solution Structure, Participants, Collaboration Implementation, Sample Code, Known uses (已知应用) Consequences Consequences (效果), Related pattern (相关模式) Institute of Computer Software Nanjing University 2018/11/23 21
关于GoF的“Design Pattern” 对已有模式的整理、分类 一套描述模式的词汇,可用于交流和文档化 为软件设计总结了宝贵的经验,这些设计经验 可以被重用,但不是简单的代码重用 在软件设计模式领域,起到先驱的作用 Institute of Computer Software Nanjing University 2018/11/23
指导模式设计的三个概念 重用(reuse):是目标 接口与实现分离 Decouple 两种重要的重用手段 接口保持不变,分离带来灵活性 Inheritance & composition 接口与实现分离 接口保持不变,分离带来灵活性 多态性(polymorphism) Decouple 降低复杂性 Institute of Computer Software Nanjing University 2018/11/23
模式分类 Gang of Four的分类 Creational (创建型) Structural (结构型) Behavioral (行为型) Institute of Computer Software Nanjing University 2018/11/23 24
模式分类 Gang of Four的分类 Creational (创建型) Structural (结构型) Behavioral (行为型) Institute of Computer Software Nanjing University 2018/11/23
Creational Patterns 创建模式是对类的实例化过程的抽象化。 怎样创建对象,创建哪些对象,如何组合和表示这 些对象? 创建模式描述了怎样构造和封装这些动态决定 Institute of Computer Software Nanjing University 2018/11/23
Creational Patterns Simple Factory 简单工厂 Factory Method 工厂方法 Abstract Factory 抽象工厂 Builder 构造者 Prototype 原型 Singleton 单例 Institute of Computer Software Nanjing University 2018/11/23
Simple Factory Alias: Static Factory Method 静态工厂方法 Intent Motivation 由一个工厂对象决定创建出哪一种产品类的实例 Motivation 负责将大量有共同接口的类实例化 Institute of Computer Software Nanjing University 2018/11/23
Example Sample Code Institute of Computer Software 2018/11/23 Nanjing University 2018/11/23
Solution Structure Institute of Computer Software 2018/11/23 Nanjing University
Participants Product Concrete Product Creator (工厂类) 定义产品共同拥有的接口 静态方法中含有与应用紧密相关的业务逻辑,在客 户端的直接调用下创建产品对象 Institute of Computer Software Nanjing University 2018/11/23
Consequences 优点:由工厂类决定在什么时候创建哪一个产 品类的实例,而客户端可以免除直接创建产品 对象的责任,而仅仅负责“消费”产品。 缺点:工厂类集中了所有的产品创建逻辑(God Class);创建新产品比较困难;静态方法无法由 子类继承,无法形成基于继承的等级结构。 Institute of Computer Software Nanjing University 2018/11/23
Factory Method Alias:virtual constructor 虚构造器 Intent Motivation Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses. (定义一个用于创建对象的接 口,让子类决定实例化哪一个类。Factory Method使一个类 的实例化延迟到其子类。 ) Motivation Frameworks use abstract classes to define and maintain relationships between objects. A framework is often responsible for creating these objects as well. 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。 框架使用抽象类定义和维护对象之间的关系。这些对象的创建通常也由框架负责。 Institute of Computer Software Nanjing University 2018/11/23 33
Example Factory method Institute of Computer Software 2018/11/23 Nanjing University 2018/11/23
Applicability Use the Factory Method pattern when a class can't anticipate the class of objects it must create. (当一个类不知道它所必须创建的对象的类的时候) a class wants its subclasses to specify the objects it creates. (当一个类希望由它的子类来指定它所创建的对象的时候) classes delegate responsibility to one of several helper subclasses, and you want to localize the knowledge of which helper subclass is the delegate. (当类将创建对象的 职责委托给多个帮助子类中的某一个,并且你希望将哪一个 帮助子类是代理者这一信息局部化的时候。) • 当一个类不知道它所必须创建的对象的类的时候。 • 当一个类希望由它的子类来指定它所创建的对象的时候。 • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。 Institute of Computer Software Nanjing University 2018/11/23 35
Solution structure Institute of Computer Software 2018/11/23 Nanjing University 2018/11/23 36
Participants Product ConcreteProduct Creator ConcreteCreator 定义工厂方法所创建的对象的接口 ConcreteProduct 实现Product接口 Creator 声明工厂方法,该方法返回一个Product类型的对象。Creator也可 以定义一个工厂方法的缺省实现,它返回一个缺省的 ConcreteProduct对象 可以调用工厂方法以创建一个Product对象 ConcreteCreator 重定义工厂方法以返回一个ConcreteProduct实例 Institute of Computer Software Nanjing University 2018/11/23
Collaborations Creator依赖于它的子类来定义工厂方法,所以 它返回一个适当的ConcreteProduct实例。 Sample Code Institute of Computer Software Nanjing University 2018/11/23
Consequences 多态性:客户代码可以做到与特定应用无关,适用于 任何实体类 缺点:需要Creator和相应的子类作为factory method的 载体,如果应用模型确实需要creator和子类存在,则 很好;否则的话,需要增加一个类层次 优点: (1) Provides hooks for subclasses。基类为factory method提 供缺省实现,子类可以重写新的实现,也可以继承父类 的实现。-- 加一层间接性,增加了灵活性 Institute of Computer Software Nanjing University 2018/11/23 39
Consequences (2) Connects parallel class hierarchies Institute of Computer Software Nanjing University 2018/11/23 40
Implementation Creator类的两种不同情况 参数化工厂方法,使得工厂方法可以创建多种产品,采用一个标识要 被创建的对象种类的参数 Institute of Computer Software Nanjing University 2018/11/23 41
Implementation Lazy initialization 特定语言的变化和问题 SmallTalk使用一个方法返回被实例化的对象的类 C++中的工厂方法都是虚函数并且常常是纯虚函数,在Creator的 构造器中不要调用工厂方法 使用模板以避免创建子类 Lazy initialization Institute of Computer Software Nanjing University 2018/11/23
Related Patterns Simple factory:如果只有一个具体工厂类,可以 改造为Simple factory Abstract factory:经常用工厂方法来实现 Prototype:不需要创建Creator的子类,但它们通 常需要一个针对Product类的Initialize操作 Template Method:工厂方法经常被调用 Institute of Computer Software Nanjing University 43 2018/11/23 43
Abstract Factory Aliases: Kit Intent Motivation “Provide an interface for creating families of related or dependent objects without specifying their concrete classes.” (提 供一个创建一系列相关或相互依赖对象的接口,而无需指定 它们具体的类 – 客户端不必指定产品的具体类型,创建多个 产品族中的产品对象) Motivation JFC Swing Look & Feel 为保证视感风格标准间的可移植性,应用不应该为一个特定的视 感外观硬编码它的窗口组件。在整个应用中实例化特定视感风格 的窗口组件类将使得以后很难改变视感风格。 Institute of Computer Software Nanjing University 2018/11/23 44
Example 每一种窗口组件都有一个抽象类,而具体子类则实现了窗口组件的特定视感风格。 定义一个抽象的WidgetFactory类,声明一个用来创建每一种基本窗口组件的接口。 对于每一个抽象窗口组件类, WidgetFactory接口都有一个返回新窗口组件对象的操作。 Institute of Computer Software Nanjing University 2018/11/23 45
Applicability 一个系统要独立于它的产品的创建、组合和表示时。 一个系统要由多个产品系列中的一个来配置时。 当你要强调一系列相关的产品对象的设计以便进行联 合使用时。 当你提供一个产品类库,而只想显示它们的接口而不 是实现时。 Institute of Computer Software Nanjing University 2018/11/23 46
Solution Structure: Sample Code Institute of Computer Software Nanjing University 2018/11/23 47
Participants AbstractFactory (WidgetFactory) 声明创建抽象产品对象的接口。 ConcreteFactory (MotifWidgetFactory, PMWidgetFactory) 实现创建具体产品对象的操作. AbstractProduct (Window, ScrollBar) 为一种产品对象声明一个接口。 ConcreteProduct (MotifWindow, MotifScrollBar) 定义将被相应的具体工厂创建的产品对象。 — 实现AbstractProduct接口。 Client 仅使用由AbstractFactory和AbstractProduct类声明的接口 Institute of Computer Software Nanjing University 2018/11/23 48
Collaborations 通常在运行时刻创建一个ConcreteFactroy类的实 例。这一具体的工厂创建具有特定实现的产品 对象。为创建不同的产品对象,客户应使用不 同的具体工厂。 AbstractFactory将产品对象的创建延迟到它的 ConcreteFactory子类。 Sample Code Institute of Computer Software Nanjing University 2018/11/23 49
Consequences 分离了具体的类,一个工厂封装创建产品对象的责任 和过程,它将客户与类的实现分离 易于交换产品系列,只需改变具体的工厂就可以使用 不同的产品配置。 有利于产品的一致性,当一个系列中的产品对象被设 计成一起工作时,一个应用一次只能使用同一个系列 中的对象。 缺点:难以支持新的产品等级结构 (AbstractProductX),支持新的产品等级结构就要扩 展抽象工厂接口。 1) 它分离了具体的类Abstract Factory模式帮助你控制一个应用创建的对象的类。因为 一个工厂封装创建产品对象的责任和过程,它将客户与类的实现分离。客户通过它们的抽象 接口操纵实例。产品的类名也在具体工厂的实现中被分离;它们不出现在客户代码中。 2) 它使得易于交换产品系列一个具体工厂类在一个应用中仅出现一次—即在它初始化 的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同 的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻 改变。在我们的用户界面的例子中,我们仅需转换到相应的工厂对象并重新创建接口,就可 实现从M o t i f窗口组件转换为Presentation Manager窗口组件。 3) 它有利于产品的一致性当一个系列中的产品对象被设计成一起工作时,一个应用一 次只能使用同一个系列中的对象,这一点很重要。而A b s t r a c t F a c t o r y很容易实现这一点。 4) 难以支持新种类的产品难以扩展抽象工厂以生产新种类的产品。这是因为 A b s t r a c t F a c t o r y接口确定了可以被创建的产品集合。支持新种类的产品就需要扩展该工厂接口, 这将涉及A b s t r a c t F a c t o r y类及其所有子类的改变。我们会在实现一节讨论这个问题的一个解决 办法。 Institute of Computer Software Nanjing University 2018/11/23 50
Discussion Choose Look & Feel once for all ---- Single Choice Principle! Change Look & Feel dynamically ---- Polymorphism. Separation of interface and implementation ---- Interface Inheritance Institute of Computer Software Nanjing University 2018/11/23 51
Related Patterns AbstractFactory类通常用Factory Method实现,但 它们也可以用Prototype实现 一个具体的工厂通常是一个单件(Singleton) Institute of Computer Software Nanjing University 2018/11/23
Builder Intent Motivation Separate the construction of a complex object from its representation so that the same construction process can create different representations (将一个复杂对象的构建 与它的表示分离,使得同样的构建过程可以创建不同的 表示。) Motivation 在复杂对象的构造过程中,允许同样的构造过程能够加 入新的被构造元素 “结构化构造过程” Institute of Computer Software Nanjing University 2018/11/23
Example Institute of Computer Software Nanjing University 2018/11/23
Example Institute of Computer Software Nanjing University 2018/11/23
Applicability Use the Builder pattern when the algorithm for creating a complex object should be independent of the parts that make up the object and how they‘re assembled. (当创建复杂对象的算法应该独立于该 对象的组成部分以及它们的装配方式时) the construction process must allow different representations for the object that‘s constructed. (当构造过程必须允许被 构造的对象有不同的表示时) Institute of Computer Software Nanjing University 2018/11/23
Solution Structure Institute of Computer Software 2018/11/23 Nanjing University 2018/11/23
Participants Builder ConcreteBuilder Director Product 定义并明确它所创建的表示 提供一个检索产品的接口 Director 构造一个使用Builder接口的对象 Product 表示被构造的复杂对象 包含定义组成部件的类,包括这些部件装配成最终产品的接 口 Institute of Computer Software Nanjing University 2018/11/23
Collaboration Sample Code Client创建Director对象, 并用它所想要的 Builder对象进行配置 Builder处理Director的 请求,并将部件添加 到产品中 客户从Builder中检索 产品 Sample Code Institute of Computer Software Nanjing University 2018/11/23
Consequences 可以改变一个产品的内部表示。产品是通过抽 象接口构造的,在改变产品内部表示时所要做 的只是定义一个新的生成器。 将构造代码和表示代码分开。通过封装一个复 杂对象的创建和表示方式提高了对象的模块性。 可以对构造过程进行更精细的控制。 Institute of Computer Software Nanjing University 2018/11/23
Implementation 装配和构造接口:Builder逐步构造产品,因此 Builder类接口必须足够普遍,以便为各种类型的 具体Builder构造产品 为什么没有抽象类? -- 生成的产品相差很大以至 于没必要提供公共父类 在Builder中缺省的方法为空:使客户只重定义他 们感兴趣的操作 Institute of Computer Software Nanjing University 2018/11/23
Related patterns Composite通常是用Builder生成的 Abstract Factory 相似:可以创建复杂对象 区别:(1) Builder着重于一步步构造一个复杂对象, 而Abstract Factory着重于多个系列的产品对象; (2) Builder在最后的一步返回产品,而Abstract Factory 中产品是立即返回的。 Composite通常是用Builder生成的 Institute of Computer Software Nanjing University 2018/11/23
Prototype Intent Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype. (用原型实例指定创建对 象的种类,并且通过拷贝这些原型创建新的对 象) Motivation 以一个已有的对象作为原型,通过它来创建新的对象。 在增加新的对象的时候,新对象的细节创建工作由自 己来负责,从而使新对象的创建过程与框架隔离开来 Institute of Computer Software Nanjing University 2018/11/23
Example Java 语言的构件模型直接支持Prototype模式 java.lang.Object 根类 protected Object clone(); java.lang.Cloneable 接口 Institute of Computer Software Nanjing University 2018/11/23
Applicability 当一个系统应该独立于它的产品创建、构成和 表示时 当要实例化的类是在运行时刻指定时,例如动 态装载 为了避免创建一个与产品类层次平行的工厂类 层次时 当一个类的实例只能有几个不同状态组合中的 一种时 Institute of Computer Software Nanjing University 2018/11/23
Solution Structure Institute of Computer Software 2018/11/23 Nanjing University 2018/11/23
Participants Prototype ConcretePrototype Client 声明一个克隆自身的接口 实现一个克隆自身的接口 Client 让一个原型克隆自身从而创建一个新的对象。 Institute of Computer Software Nanjing University 2018/11/23
Collaborations 客户请求一个原型克隆自身 Sample Code Institute of Computer Software Nanjing University 2018/11/23
Consequences 缺点:每个Prototype的子类都必须实现Clone操 作。 对客户隐藏了具体的产品类,因此减少了客户知 道的名字的数目,使客户无需改变即可使用与特 定应用相关的类。此外,还具有以下优点: 运行时刻增加和删除产品 改变值以指定新对象 改变结构以指定新对象 减少子类的构造 用类动态配置应用 缺点:每个Prototype的子类都必须实现Clone操 作。 Institute of Computer Software Nanjing University 2018/11/23
Implementation 使用一个原型管理器(prototype manager) 当一个系统中原型数目不固定时,要保持一个可用原型的注册表 Client:客户端向管理员提出创建对象的请求; Prototype Manager: 创建具体原型类的对象,并记录每一个被创建的对象 2018/11/23 Institute of Computer Software Nanjing University
Implementation 实现Clone操作 初始化克隆对象 思考题:考虑Java中如何使用序列化做深拷贝 shallow copy vs. deep copy Save & Load 初始化克隆对象 在Clone操作中传递参数会破坏克隆接口的统一性 引入Initialize操作,使用初始化参数并据此设定克隆对象 的内部状态。注意深拷贝Clone操作。 浅拷贝只复制所考虑的对象,而不复制它所引用的对象 深拷贝把要复制的对象所引用的对象都复制了一遍 思考题:考虑Java中如何使用序列化做深拷贝 Institute of Computer Software Nanjing University 2018/11/23
Discussion Why not use “new”? 如果您有一个对象,有着复杂的状态。您希望得到 另一个拷贝,但是同时具有一模一样的状态,如果 选择从头创建一个新的对象,您将不得不重新一个 一个地设置这些状态。有的时候着很麻烦,有的时 候这不可能做到。这种时候,使用原始模型模式, 调用一个克隆方法,就变成非常好的办法。 Institute of Computer Software Nanjing University 2018/11/23
Related Patterns Prototype与Abstract Factory往往是相互竞争的, 但是它们也可以一起使用。Abstract Factory可以 存储一个被克隆的原型的集合,并且返回产品对 象 大量使用Composite和Decorator模式的设计通常 也从Prototype模式处获益 Institute of Computer Software Nanjing University 2018/11/23
Singleton Intent Motivation Ensure a class only has one instance, and provide a global point of access to it. (一个类仅有一个实例, 自行实例化并向整个系统提供一个访问它的全局访 问点) Motivation 对一些类来说,只有一个实例是很重要的,比如 printer spooler Instance-controlled class 实例控制 Institute of Computer Software Nanjing University 2018/11/23
Applicability there must be exactly one instance of a class, and it must be accessible to clients from a well-known access point. (当类只有一个实例而且客户可以从一个众所周知的 访问点访问它时) When the sole instance should be extensible by subclassing, and clients should be able to use an extended instance without modifying their code. (当这个唯一的实 例应该是通过子类化可扩展的,并且客户应该无需更 改代码就能使用一个扩展的实例时) Institute of Computer Software Nanjing University 2018/11/23
Solution Structure Institute of Computer Software 2018/11/23 Nanjing University 2018/11/23
Participants Singleton 定义一个Instance操作,允许客户访问它的唯一实 例。Instance是一个类操作。 可能负责创建它自己的唯一实例 Institute of Computer Software Nanjing University 2018/11/23
Collaboration 客户只能通过Singleton的Instance操作访问一 个Singleton的实例 Sample Code Institute of Computer Software Nanjing University 2018/11/23
Consequences 对唯一实例的受控访问 缩小名空间,是对全局变量的一种改进 允许对操作和表示的精化,Singleton类可以有子 类 允许可变数目的实例 比类操作更灵活 (static member functions in C++ ) Institute of Computer Software Nanjing University 2018/11/23
Implementation 保证一个唯一的实例 创建Singleton的子类 考虑使用lazy initialize (懒汉式) 使用global/static object的缺点:所有单件无论用 到与否都要被创建,使用静态成员函数可避免。 创建Singleton的子类 单例注册表 思考题:Singleton对象在多线程情况下使用需要 注意哪些问题? Institute of Computer Software Nanjing University 2018/11/23
Related patterns Singleton与其他创建型模式并不矛盾,可以用 Singleton来实现其他模式中的对象。包括 Abstract Factory、Builder、Prototype等。 多个实例对于构造过程往往并无意义,所以 在许多情况下Singleton模式比较符合应用背景 思考题:多例模式如何实现? Institute of Computer Software Nanjing University 2018/11/23
增加:Monostate [BALL2000] Intent Motivation Solution/Implementation 另外一种获取对象单一性的方法 Motivation 无论创建了多少Monostate的实例,它们都表现得像 一个对象一样,甚至把当前的所有实例都销毁或者 解除职责,也不会丢失数据。 Solution/Implementation 将所有变量都设置为静态的 Institute of Computer Software Nanjing University 2018/11/23
Example Sample Code public class Monostate{ private static int itsX=0; public Monostate(){} public void setX(int x){ itsX = x;} public int getX() {return itsX;} } Sample Code 2018/11/23 Institute of Computer Software Nanjing University
Consequences 优点 透明性:使用Monostate对象和使用常规对象没有什么区别, 使用者不需要知道对象是monostate 可派生性:派生类都是Monostate 多态性:由于方法不是静态的,所以可以在派生类中 override。因此不同的派生类可以基于同样的静态变量表现 出不同的行为 缺点 不可转换性:不能透过派生把常规类转换成Monostate类 内存占用:即使从未使用Monostate,它的变量也要占用内存 空间 Institute of Computer Software Nanjing University 2018/11/23
Related Patterns Singleton模式使用时由构造函数,一个静态变量,以 及一个静态方法对实例化进行控制和限制 Monostate模式只是简单地把对象的所有变量变成静态 的。 如果希望透过派生去约束一个现存类,并且不介意它 的调用者都必须调用instance()方法来获取访问权,那 么Singleton是最合适的。 如果希望类的单一性本质对使用者透明,或者希望使 用单一对象的多态派生对象,那么Monostate是最适合 的。 Institute of Computer Software Nanjing University 2018/11/23
Summary:Creational Patterns Factory Method 本质:用一个virtual method完成创建过程 Abstract Factory 一个product族的factory method构成了一个factory接口 Prototype 通过product原型来构造product,Clone + prototype manager Builder 通过一个构造算法和builder接口把构造过程与客户隔离开 Singleton 单实例类型。由构造函数,一个静态变量,以及一个静态方法对 实例化进行控制和限制 Institute of Computer Software Nanjing University 86 2018/11/23 86
Summary:Creational Patterns 创建型模式抽象了实例化的过程 类创建模式使用继承改变被实例化的类 对象创建模式将实例化委派给其它对象 创建型模式中不断出现的主题 封装了系统所使用的具体类的信息 隐藏了如何创建和组成这些具体类的实例 了解每一种模式的实质 具体实现的时候可能会有变化情况,或者扩展,或 者退化 Institute of Computer Software Nanjing University 87 2018/11/23 87
Summary:Creational Patterns Factory Method是基础,Abstract Factory是它的 扩展 Factory Method、Abstract Factory、Prototype都涉 及到类层次结构中对象的创建过程,有所取舍 Prototype需要Prototype Manager Factory Method需要依附一个Creator类 Abstract Factory需要一个平行的类层次 根据应用的其他需求,以及语言提供的便利来决定 使用哪种模式 Institute of Computer Software Nanjing University 2018/11/23
Summary:Creational Patterns Builder往往适合于特定的结构需要,它所针对的 product比较复杂 Singleton有比较强烈的物理意义,可以用在许多 细微的地方,不一定与类层次关联 这些patterns都很常见,有时需要结合两种或者 多种模式完成系统中对象的构造过程 Institute of Computer Software Nanjing University 89 2018/11/23 89
作业 Factory Method模式和Abstract Factory模式的区 别在哪?一般哪些情况下适合用前者,哪些情 况下适合用后者? 解释Java中clone()方法和java.lang.Cloneable接口 的关系,如果想要实现深拷贝可以有哪些方法? java.lang.Math类和java.lang.StrictMath类是否是 单例模式? Institute of Computer Software Nanjing University 2018/11/23