package com.lkr.dataStructure.designPatterns;
import java.util.HashMap;
import java.util.Map;
/*
单例模式,是java中最简单的设计模式之一,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。
这个类提供了一种访问唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
1。单例类只能有一个实例
2。单例类必须自己创建自己的唯一实例
3。单例类必须给所有其他对象提供这一实例
*/
//饿汉模式
public class SingletonTest {
private static SingletonTest instance = new SingletonTest();
private SingletonTest(){
}
private static SingletonTest getInstance(){
return instance;
}
}
//懒汉模式(线程不安全)
public class Singleton2{
private static Singleton2 instance;
private Singleton2(){
}
public Singleton2 getInstance(){
if(null == instance){
instance = new Singleton2();
}
return instance;
}
}
//懒汉模式(线程安全)
public class Singleton3{
private static Singleton3 instance;
private Singleton3(){
}
public static synchronized Singleton3 getInstance(){
if(null == instance){
instance = new Singleton3();
}
return instance;
}
}
//双重检查模式(dcl)
//推荐用
public class Singleton4{
private static volatile Singleton4 instance;
private Singleton4(){
}
public static Singleton4 getInstance(){
if(null == instance){}
synchronized (Singleton4.class){
if(null == instance){
instance = new Singleton4();
}
}
return instance;
}
}
//静态内部类单例模式
//推荐用
public class Singleton5{
private Singleton5(){
}
public static Singleton5 getInstance(){
return SingletonHolder.INSTANCE;
}
public static class SingletonHolder{
private static final Singleton5 INSTANCE = new Singleton5();
}
}
//枚举单例
//默认枚举实例的创建是线程安全的,并且在任何情况下都是单例
public enum Singleton6{
INSTANCE;
public void doSomething(){
}
}
//使用容器实现单例模式
public class SingletonManager{
private static Map<String,Object> objMap = new HashMap<String, Object>();
private SingletonManager(){
}
public static void registerService(String key,Object instance){
if(!objMap.containsKey(key)){
objMap.put(key,instance);
}
}
public static Object getService(String key){
return objMap.get(key);
}
}