设计模式 Design Patterns 可复用模式

设计模式 Design Patterns

概述

导致重新设计的一般原因\r\n通过显式指定一个类来创建对象\r\n对特殊操作的依赖\r\n对硬件和软件平台的依赖\r\n对对象表示和实现的依赖\r\n对算法的依赖\r\n紧耦合\r\n通过生成子类来扩充功能\r\n不能方便地对类进行修改

概述

继承、组合、参数化类型\r\n类继承与接口继承的比较\r\n继承与组合的比较\r\n继承与参数化类型的比较

原则一:对接口编程,而不是对实现编程

原则二:优先使用对象组合,而不是继承

概述

可复用模式

概述

什么是设计模式\r\n设计模式是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述。\r\n每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。

概述

设计模式编目

创建型模式

创建型模式的目的\r\n使系统独立于如何创建、组合和表示对象。\r\n类创建型模式使用继承改变被实例化的类。\r\n对象创建型模式将实例化委托给另一个对象。

Abstract Factory

Builder

Factory Method

Prototype

Singleton

什么是单例(Singleton)模式

作为对象的创建模式[GOF95],单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。\r\n单例模式的三个要点:\r\n只能有一个实例;\r\n必须自行创建这个实例;\r\n它必须自行向整个系统提供这个实例。

0.什么是单例(Singleton)模式

一个例子:Windows 回收站\r\n\r\n\r\n\r\n\r\n\r\n在整个视窗系统中,回收站只能有一个实例,整个系统都使用这个惟一的实例,而且回收站自行提供自己的实例。因此,回收站是单例模式的应用。

1.单例模式的结构

单例类的简略类图如下所示。

单例模式在Java语言的实现上有自己的特别,这些特点往往表现在如何将自己实例化上,大致有以下三种:\r\n饿汉式单例类\r\n懒汉式单例类

2.单例模式的实例化形式

饿汉式单例类\r\n饿汉式单例类是在Java 语言里实现得最为简便的单例类。\r\n\r\n\r\n\r\n\r\n\r\n\r\n此类自己将自己实例化.

2.单例模式的实例化形式

饿汉式单例类代码清单:\r\n public class EagerSingleton {\r\n //加载时就实例化\r\n private static final EagerSingleton m_instance = new EagerSingleton();\r\n\r\n //私有的构造方法\r\n     private EagerSingleton() { }\r\n\r\n //静态工厂方法\r\n   public static EagerSingleton getInstance() {\r\n         return m_instance;\r\n     }\r\n}

2. 单例模式的实例化形式

懒汉式单例类\r\n与饿汉式单例类相同之处是,类的构造方法是私有的。\r\n与饿汉式单例类不同的是,懒汉式单例类在第一次被引用时将自己实例化。如果加载器是静态的,那么在懒汉式单例类被加载时不会将自己实例化。

2. 单例模式的实例化形式

懒汉式单例类代码清单:\r\npublic class LazySingleton{\r\n private static LazySingleton m_instance = null;\r\n    private LazySingleton() { }\r\n\r\n //静态工厂方法,在获取实例时才实例化\r\n    synchronized public static LazySingleton getInstance(){\r\n    if (m_instance == null){\r\n        m_instance = new LazySingleton();\r\n    }\r\n    return m_instance;\r\n }\r\n}

3.在什么情况下使用单例模式?

使用单例模式的条件\r\n使用单例模式有一个很重要的必要条件:在一个系统要求一个类只有一个实例时才应当使用单例模式。反过来说,如果一个类可以有几个实例共存,那么就没有必要使用单例类。\r\n但是做到上面这一点并不容易,下面就是一些这样的情况。

4.在什么情况下使用单例模式?

例子一\r\n问:我的一个系统需要一些“全程”变量。学习了单例模式后,我发现可以使用一个单例类盛放所有的“全程”变量。请问这样做对吗?\r\n答:这样做是违背单例模式的用意的。单例模式只应当在有真正的“单一实例”的需求时才可使用。\r\n\r\n 一个设计得当的系统不应当有所谓的“全程”变量,这些变量应当放到它们所描述的实体所对应的类中去。将这些变量从它们所描述的实体类中抽出来,放到一个不相干的单例类中去,会使得这些变量产生错误的依赖关系和耦合关系。

4.在什么情况下使用单例模式?

例子二\r\n问:我的一个系统需要管理与数据库的连接。学习了单例模式后,我发现可以使用一个单例类包装一个Connection 对象,并在finalize()方法中关闭这个Connection 对象。这样的话,在这个单例类的实例没有被人引用时,这个finalize()对象就会被调用,因此,Connection 对象就会被释放。这多妙啊。\r\n答:这样做是不恰当的。除非有单一实例的需求,不然不要使用单例模式。在这里Connection 对象可以同时有几个实例共存,不需要是单一实例。\r\n\r\n 单例模式有很多的错误使用案例都与此例子相似,它们都是试图使用单例模式管理共享资源的生命周期,这是不恰当的。