单例模式,单例模式静态内部类

http://www.itjxue.com  2023-01-14 18:10  来源:未知  点击次数: 

什么是单例模式

单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。

拓展:

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

2、单例模式优缺点:

优点:一、实例控 二、灵活性

缺点:一、开销 二、可能的开发混淆 三、对象生存期

3、单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯 一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类 的唯一实例的机制,“阻止”所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个 方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。

设计模式之单例模式

单例设计模式理解起来非常简单。一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫单例模式。

下面的示例中如果每个类都创建一个 Logger 实例,就可能造成日志内容被覆盖的情况。

如果有些数据在系统中只应保存一份,那就比较适合设计为单例类。比如,配置信息类,全局 ID 生成器等。

要实现一个单例,我们要考虑以下几点:

懒汉式相对于饿汉式的优势是 「支持延迟加载」 。但缺点也很明显,因为使用了 synchronized 关键字导致这个方法的 「并发度很低」 。如果这个单例类偶尔会被用到,那这种实现方式还可以接受。但是,如果频繁地用到,就会导致性能瓶颈,这种实现方式就不可取了。

这是一种既支持延迟加载、又支持高并发的单例实现方式。

在 java1.5 以下 instance = new Singleton(); 有指令重排问题,需要给 instance 成员变量加上 volatile 关键字,java1.5 之后不会再这个问题。

这种方式利用了 Java 的静态内部类,有点类似饿汉式,但又能做到了延迟加载。

当外部类 Singleton 被加载的时候,并不会创建 SingletonHolder 实例对象。只有当调用 getInstance() 方法时,SingletonHolder 才会被加载,这个时候才会创建 instance。insance 的唯一性、创建过程的线程安全性,都由 JVM 来保证。所以,这种实现方法既保证了线程安全,又能做到延迟加载。

这是一种最简单的实现方式,基于枚举类型的单例实现。这种实现方式是通过 Java 枚举类型本身的特性,保证了实例创建的线程安全性和实例的唯一性。

上面的单例类对象是进程唯一的,一个进程只能有一个单例对象。那如何实现一个线程唯一的单例呢?

假设 IdGenerator 是一个线程唯一的单例类。在线程 A 内,我们可以创建一个单例对象 a。因为线程内唯一,在线程 A 内就不能再创建新的 IdGenerator 对象了,而线程间可以不唯一,所以,在另外一个线程 B 内,我们还可以重新创建一个新的单例对象 b。

我们通过一个 ConcurrentHashMap 来存储对象,其中 key 是线程 ID,value 是对象。这样我们就可以做到,不同的线程对应不同的对象,同一个线程只能对应一个对象。实际上,Java 语言本身提供了 ThreadLocal 工具类,可以更加轻松地实现线程唯一单例。

关于单例模式,如何理解?

单例模式就是 :

1、类的构造函数为private,即外部程序不能通过new关键字创建对象的实例

2、类中提供一个private static的 类变量引用 ;

3、单例类中提供静态方法 定义为 public static 的方法获取一个类的实例 ;

4、静态方法返回 类的引用,即 第2点中的 私有 静态变量 。

私有静态变量可以 定义的时候初始化 ,也可以 在第一次使用的时候,即调用AA.getInstanc()方法中判断 静态变量是否为空在初始化 。

(责任编辑:IT教学网)

更多