设计模式之单例模式

  单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例,即一个类只有一个对象实例。

  Java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”  

package 单例模式;
import java.util.HashMap;
import java.util.Map;
//1.懒汉式单例类,调用getInstance()则实例化,不调用不实例化
public class Singleton {
	/**
	 * Singleton通过将构造方法限定为private避免了类在外部被实例化,
	 * 在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。
	 */
	private Singleton(){}
	private static Singleton single=null;
	//确保线程安全的写法
	//(1)在getInstance方法上加同步
	public static synchronized Singleton getInstance(){
		if(single==null){
			single=new Singleton();
		}
		return single;		
	}
	//(2)双重检查锁定
	public static Singleton getInstance2(){
		if(single==null){
			synchronized(Singleton.class){
				if(single==null){
					single=new Singleton();
				}
			}
		}
		return single;
	}	
}
	//(3)静态内部类[既实现了线程安全,又避免了同步带来的性能影响]
	class SingletonStatic{
		private static class LazyHolder{
			private static final SingletonStatic INSTANCE=new SingletonStatic();			
		}
		private SingletonStatic(){}
		public static final SingletonStatic getInstance(){
			return LazyHolder.INSTANCE;
		}
	}
	
	/**
	 * 2.饿汉式单例类,在类初始化时,已经自行实例化
	 * 饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,
	 * 		以后不再改变,所以天生是线程安全的。
	 */
	class Singleton2{
		private Singleton2(){}
		private static final Singleton2 single=new Singleton2();
		//静态工厂方法
		public static Singleton2 getInstance(){
			return single;
		}
	}
----------------------------------------------
package 单例模式;
/*
 * 测试类
 */
public class Test {
	public static void main(String[] args) {
//		Singleton3 single3=Singleton3.getInstance(null);
//		System.out.println(single3.about());
		Singleton s1=Singleton.getInstance();
		Singleton s2=Singleton.getInstance();
		System.out.println(s1);
		System.out.println(s2);
	}
}

  执行测试类,控制台打印如下:

单例模式.Singleton@1db9742
单例模式.Singleton@1db9742  
posted @ 2018-04-06 23:32  奔跑在梦想的道路上  阅读(161)  评论(0编辑  收藏  举报