设计模式java——单例模式

单例模式(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("枚举最好用的单例模式");
	};
}

结果:


猜你喜欢

转载自blog.csdn.net/flylikebutterfly/article/details/79822403