前言
有一些对象其实我们只需要一个,比如说,线程池、缓存、对话框、处理偏好设置和注册表的对象、日志对象,充当但印记、显卡等设备的驱动程序的对象,事实上,这个对象只能有一个实例。如果制造出多个实例,就会大致许多问题的产生,例如:程序的异常行为、资源使用过量,或者不一致的结果。
怎么样样才能保证一个类只有一个实例并且能够全局访问到呢?全局变量?那么你必须在程序一开始就创建好对象。万一这个对象非常耗费资源,二程序在这次的执行过程中又一直没有用到它,不就形成浪费了吗?这时候,单例模式就闪亮登场。
概述
定义
单例模式(singleton pattern),head first设计模式中又名单件模式。确保一个类只有一个实例,并提供一个全局访问点。
注意
1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。3、单例类必须给所有其他的对象提供这一实例。
类图
uniqueInstance变量持有唯一的单件实例getInstance()方法是静态公共方法,可以和全局变量一样访问,但是单例可以通过这个方法延迟实例化单例模式的类也可以是一般的类,具有一般的属性和方法
设计模式的实现
从书上和其它博客了解到,单例模式有6种实现,感觉很精妙。
1. 懒汉式,线程不安全
public class Singleto{
private static Singleton uniqueInstance;
private Singleton (){}
public static Singleton
getInstance() {
if (uniqueInstance ==
null) {
uniqueInstance =
new Singleton();
}
return uniqueInstance;
}
}
2. 懒汉式,线程安全
public class Singleton {
private static Singleton uniqueInstance;
private Singleton (){}
public static synchronized Singleton
getInstance() {
if (uniqueInstance ==
null) {
uniqueInstance =
new Singleton();
}
return uniqueInstance;
}
}
3. 饿汉式,线程安全,但是不是延迟加载
public class Singleton {
private static Singleton uniqueInstance =
new Singleton();
private Singleton (){}
public static Singleton
getInstance() {
return uniqueInstance;
}
}
4. 双检锁/双重校验锁(DCL,即double-checked locking),线程安全
public class Singleton(){
private static Singleton uniqueInstance;
private Singleton(){}
public static Singleton
getInstance(){
if(uniqueInstance ==
null){
sychronized(Singleton.class){
if(uniqueInstance ==
null){
uniqueInstance =
new Singleton();
}
}
}
return uniqueInstance;
}
}
5. 登记式/静态内部类,线程安全
public class Singleton {
private static class SingletonHolder {
private static final Singleton UNIQUEINSTANCE =
new Singleton();
}
private Singleton (){}
public static final Singleton
getInstance() {
return SingletonHolder.UNIQUEINSTANCE;
}
}
6. 枚举,线程安全——一脸懵逼的代码
public enum Singleton {
UNIQUEINSTANCE;
public void whateverMethod() {
}
}
总结
哇~~~突然感觉java基础太差了,最后的设计模式的实现,好多没懂。虽然,单例模式,是我接触的第一个设计模式,但是,说实话4、5、6三种,以前真没见过。涨姿势了,虽然我还没懂呢。等我懂了,我再好好补充补充。QAQ~