单例设计模式的概念
作为对象创建模式,档里模式确保某个类只有一个实例对象,而且自行创建实例并向整个系统提供这个实例。这个类称为单例类!
单例模式的提点
1,单例类只能有一个实例
2,单例类的唯一实例必须自己创建
3,单例类必须向系统提供这个唯一的实例
饿汉单例类
public class EagerSingleton {
//在类加载创建实例
private static EagerSingleton mSingleton=new EagerSingleton();
//私有构造方法
private EagerSingleton(){}
//静态工厂方法
public static EagerSingleton getInstance(){
return mSingleton;
}
}饿汉单例模式是典型的以空间换时间,在类加载时就创建出来,不管你用不用。在随后的工厂方法中就不需要做判断,节省了运行的时间。
懒汉单例类
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton(){}
public static LazySingleton getInstance(){
//双重检查枷锁
if(instance == null){
synchronized (LazySingleton.class) {
if(instance ==null){
instance = new LazySingleton();
}
}
}
return instance;
}
}懒汉单例模式是典型的时间换空间,每次获取实例都会进行判断,是否需要创建实例,浪费判断的时间。当然如果一直没有调用此方法,则实例不会创建,节省空间。
添加一个持有单例实例的类内部类对象方法
啰嗦几个小知识点:1,类内部类是有static修饰的成员内部类。
2,类级内部类相当于外部类的static成分,不存依赖关系。
3,类级内部类相当于外部类的成员变量,只有在第一次使用时才会被加载。
public class SingletonWithHolder {
private static class SingletonHolder{
private static SingletonWithHolder instance = new SingletonWithHolder();
}
public static SingletonWithHolder getInstance(){
return SingletonHolder.instance;
}
}当客户端第一次调用getInstance()时,SingletonHolder.instance第一次被读取,导致SingleHolder初始化,会在静态域创建SingleWithHolder实例。虚拟机只会
加载静态域一次,虚拟机保证了它的线程安全。此方法延迟初始化,并没有增加任何成本!
枚举单例
单元素的枚举类型已经成为实现singleton的最佳方法。
public enum EmunSingleton {
/**
* 定义一个枚举元素,它就代表这Singleton的一个实例
*/
uiqueSingleton;
/**
* 单例的操作方法
*/
public void singleOperation(){
}
}
本文详细介绍了单例设计模式的概念,包括饿汉单例和懒汉单例的区别与实现方式。同时,通过类内部类和枚举方式展示了单例模式的灵活应用,强调了懒汉模式的双重检查机制及其带来的空间与时间权衡。
981

被折叠的 条评论
为什么被折叠?



