Java 单例模式

107 阅读3分钟

单例设计模式

单例设计(singleton)模式介绍

设计模式:

就是对一些常见问题进行归纳总结,并针对具体问题给出一套通用的解决办法(强调的是解决问题的思想);在开发中,只要遇到这类问题,就可以直接使用这些设计模式解决问题;

最早起源于建筑领域,在建筑领域把一些问题和经验进行归纳总结,形成一套可以用来在建筑领域解决大多数问题的方案;

后来计算机领域借鉴了建筑领域的设计模式,把计算机领域中经常遇到的问题进行归纳和总结,形成计算机领域23种设计模式;

单例(单态、原子)设计模式:

原理:在程序运行中,一个类最多只能有一个对象;

案例:模拟月亮,不管哪里调用的月亮,都是同一个对象

单例设计模式的代码模板

总结实现单例的步骤:

1、私有化构造函数;

2、在本类中创建唯一实例对象;

3、对外提供公开的访问方法,获取这个对象

public class Single//私有化构造函数  
    private Single() {
    }  
        //在本类中创建唯一实例对象
        private static Single s = new Single();
        //提供公开的访问方法 
        public static Single getSingle(){     
    return s; 
} 

这种方式叫做饿汉式;

这种实现方式有点问题:

这种方式,只要使用到这个类,就一定会创建对象,会造成内存的浪费;

好处是:保证对象的唯一性;

解决办法:懒汉式

public class Single {
//私有化构造函数  
private Single() {}  
//在本类中创建唯一实例对象  
private static Single s = null;
//提供公开的访问方法  public static Single getSingle(){  
if(s == null){              
s = new Single();         
}       
return s;  
} 

懒汉式的问题:

多线程环境下, 不能保证每次获取的都是同一个对象;

好处:避免内存浪费;

单例设计总结

设计模式:针对某一类问题的通用的解决办法;

单例设计模式:解决程序运行中一个类最多只能有一个实例对象的问题;

单例实现的步骤:

1、私有构造函数,避免其他类可以直接创建单例类的对象;

2、在本类中创建唯一实例,使用静态成员变量保存;为保证安全性,私有化  这个成员变量;

3、对外提供一个公开的静态方法,供其他类获取本类的唯一实例;

单例的两种实现方法

饿汉式: 在加载类的同时就创建了这个类的唯一实例;

好处:可保证这个类的实例的唯一性;

弊端:如果只是使用这个类,但是暂时不需要它的对象,也会创建唯一实例, 造成内存的浪费;

懒汉式: 在第一次调用获取实例的方法时才创建对象;

好处:第一次调用获取实例的方法时才创建对象,可以避免内存的浪费;

弊端:多线程环境下不能保证实例的唯一性;