设计模式之1单例模式

2019-08-09  本文已影响0人  hensenberg

经过了上面的《设计模式之前话一》、《设计模式之前话二》后,相信大家对设计模式的起源,定义,作用以及描述设计模式的UML语言都有了基本的了解。在一番准备工作之后,我们也将迎来将要学习的第一个设计模式---单例模式。


一、什么是单例模式?

单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个对象实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。因此使用工厂方法来限制实例化过程,而这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。

显然单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

二、如何实现单例模式?

1.用UML类图描述单例模式

UML类图描述下的单例模式

2.具体javademo代码

(1).饿汉式,这种方式可以使用,但容易产生垃圾对象。优点:没有加锁,执行效率会提高。缺点:类加载时就初始化,浪费内存(有可能加载了没有用到)。

单例饿汉式之一 单例饿汉式之二

这两种只是写法是略有不同而已。

(2).懒汉式,只有当调用getInstance方法即使用的时候,才会去初始化这个单例。懒汉式有三种实现方式,一种下线程不安全的,另外两种是线程安全的。在两种线程安全的写法里面,效率有所不同。

懒汉模式之线程不安全 懒汉模式之线程安全低效

下面这种方式采用双锁机制,在多线程情况下安全且能保持高性能。在项目中推荐使用。

懒汉模式之线程安全高效

(3).静态内部类实现方式,这种方式利用了 classloader 机制来保证初始化 singleton时只有一个实例并且线程是安全的。因为 SingletonInner 类没有被主动使用,只有通过显式调用 getInstance 方法时,才会显式装载 SingletonInner 类,从而实例化 singleton。在项目中可以使用。

静态内部类实现方式

(4).枚举实现方式,这种实现方式还没有被广泛采用,但这是实现单例模式的最佳方法。它更简洁,自动支持序列化机制,防止多次实例化。是 Effective Java 作者 Josh Bloch 提倡的方式。项目中推荐使用。

枚举实现方式

总结:在上面的多种单例实现方式中,线程安全跟效率是我们抉择的主要依据,所以懒汉模式的双检锁方式,静态内部类实现方式,枚举方式都是可以满足要求的。

思考:有关反射创建对象及反序列化,单例模式是否需要改进,又将如何改进呢?


三、实际应用例子

jdk的Runtime类......

单例模式的简单介绍到这就结束了,学以致用,快看看哪里会用的到吧。下一章,我们将学习另外一个经典的设计模式--工厂模式。

上一篇下一篇

猜你喜欢

热点阅读