如何实现单例设计模式? 有更新!

  |   0 评论   |   1,844 浏览

众所周知,单例设计模式有以下几种方式.
  (1).饿汉式;

  (2).懒汉式(加同步锁的懒汉式、加双重校验锁的懒汉式、防止指令重排优化的懒汉式);

  (3).登记式单例模式;

  (4).静态内部类单例模式;

  (5).枚举类型的单例模式。

1.什么是单例模式

单例模式(Singleton Pattern):确保一个类只有一个实例,并提供一个全局访问点。

2.如何实现一个单例模式?

2.1.实现代码

public class Singleton {
	private static Singleton instance;
	
	//构造器声明为私有,只有类内才可以调用构造器
	private Singleton(){}
	public static Singleton getInstance(){
		if(instance==null){
			synchronized (Singleton.class){
				if(instance==null){
					instance=new Singleton();
				}
			}
		}
		return instance;
	}
}

2.2.为何加入synchronized关键字

上述实现代码中加入synchronized关键字来解决多线程实例化多个对象的问题,它也存在一些问题:
1. 同步锁会降低性能
2. 第一个if判断过于多余,是否可以不判断?减少计算
解决办法:
使用饿汉式
1、饿汉式:在程序启动或单例模式类被加载的时候,单例模式实例就已经被创建。
2、懒汉式:当程序第一次访问单件模式实例时才进行创建

2.如何避免被反射?如何避免被序列化?

反射在通过newInstance创建对象时,会检查该类是否ENUM修饰,如果是则抛出异常,反射失败。

jdk文档->枚举类:
https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

3.是否有更好的解决方式?

4.枚举单例

public enum EnumSingleton {
	INSTANCE();

	private Map<String, Object> ss = new HashMap<String, Object>();
	public void put(String key,Object value) {
		ss.put(key, value);
	}
	public Object get(String key) {
		return ss.get(key);
	}
	
	public static EnumSingleton getInstance() {
		return INSTANCE;
	}
	
	
	
	private EnumSingleton() {
		
	}
}

代码简单

5.有什么优点?

1.enum可以使我们代码量变的极其简洁
2.抵御反射
3.抵御序列化
4.减少不必要代码,减少不必要计算

评论

发表评论

validate