概述
一. 单例模式的实现
单例模式的目的就是保证一个类有且仅有一个实例,并提供一个访问它的全局访问点。单例类拥有一个私有的构造函数,从而确保用户无法通过new实例化这个类。单例类中还包含一个静态私有成员变量与静态公有的工厂方法,这个工厂方法负责检验实例的存在性并实例化自己,然后存储在静态私有成员变量中,以确保只有一个实例被创建。
单例模式的实现代码如下:
public class Singleton {
private static Singleton instance = null;//静态私有成员变量
//私有构造函数
private Singleton() {
}
//静态公有工厂方法,确保返回唯一实例
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
单例模式实现过程中需要注意以下三点:
- 单例类构造函数的可见性为private
- 提供一个类型为自身的静态私有成员变量
- 提供一个公有的静态工厂方法
二. 饿汉式单例与懒汉式单例
饿汉式单例是在定义静态变量的时候就实例化单例类,因此在类加载时单例对象就已创建,代码如下:
public class Singleton {
private static Singleton instance = new Singleton();
//私有构造函数
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
单例模式实现中的代码就是懒汉式单例,与饿汉式不同的是懒汉式单例类在第一次被引用时将自己实例化,在懒汉式单例类被加载时不会将自己实例化,在类被加载时不自行实例化,这种技术又称为延迟加载技术,即需要的时候再加载实例。
在多线程环境下,为了避免多个线程同时调用getInstance()方法,可以使用关键字synchronized,代码如下:
public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
synchronized public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
而饿汉式单例类在多线程环境下就无需考录多个线程同时访问的问题,可以确保实例的唯一性。
三. 使用静态内部类实现单例模式
饿汉式单例类不能实现延迟加载,不管将来用不用都会占用内存;懒汉式单例类线程安全控制繁琐,而且性能受影响。可见,不管是饿汉式还是懒汉式都存在一些问题。为了克服这些问题,在Java语言中可以通过**IoDH(Initialization on Demand Holder)**技术来实现单例模式。在IoDH中,需要在单例类中增加一个静态内部类,在该内部类中创建单例对象,再将该对象通过getInstance()方法返回给外部使用,代码如下:
public class Singleton {
private Singleton() {
}
//静态内部类
private static class HolderClass {
private final static Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return HolderClass.instance;
}
}
上述方法由Java虚拟机来保证其线程安全性,确保成员变量只能初始化一次,由于getInstatnce()方法没有任何线程锁定,因此性能不会受到影响。
最后
以上就是飞快百合为你收集整理的【创建型设计模式】单例模式的全部内容,希望文章能够帮你解决【创建型设计模式】单例模式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复