什么是单例模式?
单例模式是指,采用某种手段或者方法,保证整个软件系统中只能存在一个对象的实例,并且该实例只提供创建该对象的方法。
使用情况及优缺点
使用情况:当您想控制实例数目,节省系统资源的时候,和一个全局使用的类频繁地创建与销毁的时候
优点:节省系统资源的开销,避免内存的重复使用
缺点:没有接口,不能继承
单例模式的例子
饿汉式
package com.cn.cmc.javadesignstyle;
public class SingletonDemo {
//获取一个单例的实例
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance() ;
Singleton singleton2 = Singleton.getInstance() ;
System.out.println(singleton1 == singleton2);
singleton1.claim();
}
}
/**
* 单例模式:程序运行中只能存在一个对象的实例
*
* 设计步骤:1. 将构造器私有化,保证外部不能创建
* 2. 初始化实例
* 3. 私有化实例,向外界提供一个返回实例的接口
* 4. 次公共方法必须通过类来调用static
*/
class Singleton{
//将构造器私有化
private Singleton(){
}
//在内部初始化一个实例
//恶汉模式:在初始化类的时候直接实例化对象
private static Singleton singleton = new Singleton() ;
//懒汉模式:初始化时候不新建对象,在具体用到的时候在实例化
private static Singleton singleton2 = null ;
//向外部提供一个返回实例方法
//饿汉
public static Singleton getInstance() {
return singleton;
}
}
懒汉式
package com.cn.cmc.javadesignstyle;
public class SingletonDemo {
//获取一个单例的实例
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance() ;
Singleton singleton2 = Singleton.getInstance() ;
System.out.println(singleton1 == singleton2);
singleton1.claim();
}
}
/**
* 单例模式:程序运行中只能存在一个对象的实例
*
* 设计步骤:1. 将构造器私有化,保证外部不能创建
* 2. 初始化实例
* 3. 私有化实例,向外界提供一个返回实例的接口
* 4. 次公共方法必须通过类来调用static
*/
class Singleton{
//将构造器私有化
private Singleton(){
}
//在内部初始化一个实例
//懒汉模式:初始化时候不新建对象,在具体用到的时候在实例化
private static Singleton singleton2 = null ;
//向外部提供一个返回实例方法
public synchronized static Singleton getInstance2(){
if(singleton2 == null){
singleton2 = new Singleton() ;
}
return singleton2 ;
}
}
注:使用懒汉模式时要注意线程安全问题,需要使用synchronized来控制进入创建实例方法的线程
静态内部类式
package com.cn.cmc.javadesignstyle;
public class SingletonDemo {
//获取一个单例的实例
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance() ;
Singleton singleton2 = Singleton.getInstance() ;
System.out.println(singleton1 == singleton2);
}
}
/**
* 单例模式:程序运行中只能存在一个对象的实例
*
* 设计步骤:1. 将构造器私有化,保证外部不能创建
* 2. 初始化实例
* 3. 私有化实例,向外界提供一个返回实例的接口
* 4. 次公共方法必须通过类来调用static
*/
class Singleton{
//将构造器私有化
private Singleton(){
}
//静态内部类方式,在第一次使用时才会加载
private static class SingletonClassInstance{
private static final Singleton instance = new Singleton() ;
}
public static Singleton getInstance(){
return SingletonClassInstance.instance ;
}
}
枚举式
package com.cn.cmc.javadesignstyle;
public class SingletonDemo {
//获取一个单例的实例
public static void main(String[] args) {
Singleton singleton1 = Singleton.INSTANCE ;
Singleton singleton2 = Singleton.INSTANCE ;
System.out.println(singleton1 == singleton2);
}
}
/**
* 单例模式:程序运行中只能存在一个对象的实例
*
* 设计步骤:1. 将构造器私有化,保证外部不能创建
* 2. 初始化实例
* 3. 私有化实例,向外界提供一个返回实例的接口
* 4. 次公共方法必须通过类来调用static
*/
enum Singleton{
//枚举类本身就是单例
INSTANCE ;
//相关操作
public void operator(){
System.out.println("操作...");
}
}
单例模式总结
饿汉式自身线程安全,调用高效但不支持延迟加载
懒汉式需要synchronized保证线程安全,支持懒加载但调用低效
静态内部类方式自身线程安全,支持懒加载且效率高效
枚举式自身线程安全,编写方便效率高效但不支持懒加载
选用时:若占用资源少,不需要懒加载,枚举式好于饿汉式
若占用资源多,需要懒加载时,静态内部类式要好于懒汉式