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

    版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/u012515223/article/details/28595349

    单件模式(singleton pattern) 具体解释


    本文地址: http://blog.csdn.net/caroline_wendy/article/details/28595349


    单件模式(singleton pattern) : 确保一个类仅仅有一个实例, 并提供一个全局訪问点.

    单位价格模式包含3个部分: 私有构造器, 静态变量, 静态方法.


    具体方法:

    1. 标准的单例模式:

    /**
     * @time 2014.6.5
     */
    package singleton;
    
    /**
     * @author C.L.Wang
     *
     */
    public class Singleton {
    	private static Singleton uniqueInstance; //静态变量
    	
    	private Singleton() {} //私有构造函数
    	
    	public static Singleton getInstance() { //静态方法
    		if (uniqueInstance == null)
    			uniqueInstance = new Singleton();
    		return uniqueInstance;
    	}
    
    }
    

    2. 考虑多线程的三种方法:

    同步(synchronized)方法, 加入"synchronized",  会导致性能下降, 每次调用演示样例, 都须要同步, 可是使用简单.

    /**
     * @time 2014.6.5
     */
    package singleton;
    
    /**
     * @author C.L.Wang
     *
     */
    public class Singleton {
    	private static Singleton uniqueInstance; //静态变量
    	
    	private Singleton() {} //私有构造函数
    	
    	public static synchronized Singleton getInstance() { //静态方法
    		if (uniqueInstance == null)
    			uniqueInstance = new Singleton();
    		return uniqueInstance;
    	}
    
    }
    


    急切(eagerly)方法, 開始时创建实例, 会在不须要时, 占用实例空间, 即占用空间时间过长.

    /**
     * @time 2014.6.5
     */
    package singleton;
    
    /**
     * @author C.L.Wang
     *
     */
    public class Singleton {
    	private static Singleton uniqueInstance = new Singleton(); //静态变量
    	
    	private Singleton() {} //私有构造函数
    	
    	public static synchronized Singleton getInstance() { //静态方法
    		//if (uniqueInstance == null)
    			//uniqueInstance = new Singleton();
    		return uniqueInstance;
    	}
    
    }
    

    双重检查加锁(double-checked locking)方法, 使用"volatile"和"synchronized (Singleton.class)", 降低时间消耗, 适用于java1.4以上版本号.

    /**
     * @time 2014.6.5
     */
    package singleton;
    
    /**
     * @author C.L.Wang
     *
     */
    public class Singleton {
    	private volatile static Singleton uniqueInstance; //静态变量
    	
    	private Singleton() {} //私有构造函数
    	
    	public static synchronized Singleton getInstance() { //静态方法
    		if (uniqueInstance == null) {
    			synchronized (Singleton.class) {
    				if (uniqueInstance == null)
    					uniqueInstance = new Singleton();
    			}
    		}
    		return uniqueInstance;
    	}
    
    }
    

    3. 使用单件模式的样例:

    代码:

    /**
     * @time 2014.6.5
     */
    package singleton;
    
    /**
     * @author C.L.Wang
     *
     */
    public class ChocolateBoiler { //巧克力锅炉
    	private boolean empty;
    	private boolean boiled;
    	
    	public static ChocolateBoiler uniqueInstance; //静态变量
    	
    	private ChocolateBoiler() { //私有构造函数
    		empty = true;
    		boiled = false;
    	}
    	
    	public static ChocolateBoiler getInstance() { //静态方法
    		if (uniqueInstance == null) 
    			uniqueInstance = new ChocolateBoiler();
    		return uniqueInstance;
    	}
    	
    	public void fill() { //填满
    		if (isEmpty()) {
    			empty = false;
    			boiled = false;
    		}
    	}
    	
    	public void drain() { //倾倒
    		if (!isEmpty() && isBoiled())
    			empty = true;
    	}
    	
    	public void boil() { //煮
    		if (!isEmpty() && !isBoiled()) {
    			boiled = true;
    		}
    	}
    	
    	public boolean isEmpty() {
    		return empty;
    	}
    	
    	public boolean isBoiled() {
    		return boiled;
    	}
    
    }
    

    4. 枚举单件(enum singleton)模式, 也能够保证线程安全.

    代码:

    /**
     * @time 2014.6.5
     */
    package singleton;
    
    /**
     * @author C.L.Wang
     *
     */
    public class EnumSingleton {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    
    		eSingleton d1 = eSingleton.INSTANCE;
    		d1.setName("Spike");
    		
    		eSingleton d2 = eSingleton.INSTANCE;
    		d2.setName("Caroline");
    		
    		System.out.println(d1);
    		System.out.println(d2);
    		
    		System.out.println(d1 == d2);
    	}
    
    }
    
    enum eSingleton {
    	
    	INSTANCE;
    	
    	private String name;
    	
    	public String getName() {
    		return name;
    	}
    	
    	public void setName(String name) {
    		this.name = name;
    	}
    	
    	@Override
    	public String toString() {
    		return "[" + name + "]";
    	}
    }

    输出:

    [Caroline]
    [Caroline]
    true
    










  • 相关阅读:
    用Java求两个字符串所有的公共子序列
    Windows系统上安装logstash和logstash-input-jdbc
    Linux下zip文件的压缩和解压命令
    Linux-root用户下新建用户及为新用户配置密码
    Linux下查看是否安装jdk的命令
    使用git clone命令报错:error: RPC failed; curl 18 transfer closed with outstanding read data remaining
    SCP not a regular file
    常用正则表达式
    Android Wear 兼容
    git diff 配置 meld diff
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10037636.html
Copyright © 2011-2022 走看看