单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。
单例模式Demo:
/**
* 2018年4月4日下午8:53:13
*/
package com.Designpattern;
/**
* @author xinwenfeng
*
*/
public class TestSingleton {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("===========1============");
MySingleton1 singleton1 = MySingleton1.getSingleton();
System.out.println(singleton1);
MySingleton1 _singleton1 = MySingleton1.getSingleton();
System.out.println(_singleton1);
System.out.println("===========2============");
MySingleton2 singleton2 = MySingleton2.getSingleton();
System.out.println(singleton2);
MySingleton2 _singleton2 = MySingleton2.getSingleton();
System.out.println(_singleton2);
System.out.println("===========3============");
MySingleton3 singleton3 = MySingleton3.getSingleton();
System.out.println(singleton3);
MySingleton3 _singleton3 = MySingleton3.getSingleton();
System.out.println(_singleton3);
System.out.println("===========4============");
MySingleton4 singleton4 = MySingleton4.getSingleton();
System.out.println(singleton4);
MySingleton4 _singleton4 = MySingleton4.getSingleton();
System.out.println(_singleton4);
System.out.println("===========5============");
MySingleton5 singleton5 = MySingleton5.getSingleton();
System.out.println(singleton5);
MySingleton5 _singleton5 = MySingleton5.getSingleton();
System.out.println(_singleton5);
System.out.println("===========6============");
MySingleton6 singleton6 = MySingleton6.SINGLETON;
singleton6.show();
}
}
//懒汉式,线程不安全
class MySingleton1{
private MySingleton1() {System.out.println("构造一个1");};//私有构造方法
private static MySingleton1 singleton;
public static MySingleton1 getSingleton() {
if(null == singleton) {
singleton = new MySingleton1();
}
return singleton;
}
}
//懒汉式,线程安全
class MySingleton2{
private MySingleton2() {System.out.println("构造一个2");};//私有构造方法
private static MySingleton2 singleton;
public synchronized static MySingleton2 getSingleton() {//每次都锁,效率低
if(null == singleton) {
singleton = new MySingleton2();
}
return singleton;
}
}
//双重检查锁,线程安全
class MySingleton3{
private MySingleton3() {System.out.println("构造一个3");};//私有构造方法
private static MySingleton3 singleton;
public static MySingleton3 getSingleton() {
if(null == singleton) {
synchronized (MySingleton3.class) {//只有为null的时候才锁,效率提高
if(null == singleton) {
singleton = new MySingleton3();
}
}
}
return singleton;
}
}
//饿汉式,线程安全
class MySingleton4{
private MySingleton4() {System.out.println("构造一个4");};//私有构造方法
private static MySingleton4 singleton = new MySingleton4();//加载类时就创建
public synchronized static MySingleton4 getSingleton() {
return singleton;
}
}
//静态内部类
class MySingleton5{
private MySingleton5() {System.out.println("构造一个5");};//私有构造方法
private static class SingletonInner{
private static MySingleton5 singleton = new MySingleton5();
}
public synchronized static MySingleton5 getSingleton() {
return SingletonInner.singleton;//调用时才创建,懒加载
}
}
//枚举类(最优)
enum MySingleton6{
SINGLETON;
public void show() {
System.out.println("枚举最好用的单例模式");
};
}
结果: