GOF23 设计模式 之单例模式

单例模式 :

保证全局只有一个类只有一个实例,并且提供一个访问该实例的访问点;

例子:

windows的回收站,任务管理器,文件系统,

应用程序的日志应用,

数据连接池的设计,

spring的控制器,Bean

Application也是典型的单例应用

********************************

分类:

1,饿汉式 天然线程安全  不能懒加载 效率高 但是浪费资源

2,懒汉式  懒加载 加锁效率低 

3,双重检测锁式  jvm 底层不安全一般不用

4,静态内部类  天然线程安全  懒加载 效率高 全部具备了 一般框架会用

5,枚举单例  jvm实现的天然线程安全,反射和反序列化都不能破解; 不能懒加载

*************************

代码实现:

1,饿汉式 

package com.singleton;

/**
 * 饿汉式
 * */
public class SingletonDemo1 {
	// 类加载时 就获取到了对象
	private static SingletonDemo1 instance = new SingletonDemo1();

	private SingletonDemo1() { // 私有化构造器
		
	}
	public static  SingletonDemo1 getInstance() {
		// 开放一个方法来获取实例
		return instance;
	}
	
}

2,懒汉式 

package com.singleton;

/**
 * 懒汉式
 * */
public class SingletonDemo2 {

	// 类加载时 没有做任何事情
		private static SingletonDemo2 instance ;

		private SingletonDemo2() { // 私有化构造器
			
		}
		// 在调用方法的时候再去加载类 ;懒加载
		public  synchronized static  SingletonDemo2 getInstance() {
			if(instance==null) {
			instance = new SingletonDemo2();
			}
			return instance;
		}

}

3,双重检测锁式  

package com.singleton;


/**
 * 双重检测锁式  
 * */
public class SingletonDemo3 {
	private String str = "";
    private int a = 0;

    private volatile static SingletonDemo3 ins = null;
    /**
     * 构造方法私有化
     */
    private SingletonDemo3(){
        str = "hello";
        a = 20;
    }

    /**
     * DCL方式获取单例
     * @return
     */
    public static SingletonDemo3 getInstance(){
        if (ins == null){
            synchronized (SingletonDemo3.class){
                if (ins == null){
                    ins = new SingletonDemo3();
                }
            }
        }
        return ins;
    }

}

4,静态内部类  

package com.singleton;

public class SingletonDemo4 {
	// 初始化的时候不会加载初始化资源,调用方法才会;
	private static class SingletonInstance{
		private static final SingletonDemo4 instance = new SingletonDemo4();
	}
	// 调用方法生成实例
	public static  SingletonDemo4 getInstance() {
		return SingletonInstance.instance;
	}
	private SingletonDemo4() { // 私有化构造器
		
	}
}

5,枚举单例  

package com.singleton;

/**
 * 枚举
 * 天然就是单例
 * */ 

public enum SingletonDemo5 {
	instance;
}
发布了189 篇原创文章 · 获赞 10 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/wangrong111222/article/details/104088878