zoukankan      html  css  js  c++  java
  • 设计模式之单例模式

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

      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  
  • 相关阅读:
    快速掌握GIT
    Codeigniter+PHPExcel导出Excel文件
    git结构拓扑图
    (转)MVC新手指南
    (转)jQuery插件开发 其实很简单
    (转)Asp.net缓存简介
    (转)让ASP.NET MVC页面返回不同类型的内容
    (转)2010 .NET面试题整理之基础篇
    (转) .NET对象的XML序列化和反序列化
    (转)2010面试攻略
  • 原文地址:https://www.cnblogs.com/lizhangyong/p/8729435.html
Copyright © 2011-2022 走看看