设计模式----单例设计模式

今天为大家介绍一个使用很频繁的设计模式----------单例设计模式

顾名思义单例设计模式 就是保持类只有一个实例,并且提供全局的访问接口。

一般作用于一些只具有唯一性的系统组件,如配置文件等

那么如何保持类的唯一性呢,就是不允许实例化,那么将他的构造方法设置为私有化就可以了。

/**
 * 
 */
package com.model.singleton;

/**
 * @author Administrator
 *	单例设计模式
 */
public class Singleton {

	/**第一种实现方法**/
	/**
	 * 设置静态字段保证程序运行时就载入
	 * 自己内部初始化自己然后私有化构造函数
	 * 只提供共有的get方法
	 * 优点反应速度快
	 * 缺点多线程可能造成多个实例
	 */
	
	private static Singleton instance = new Singleton();
	
	
	public static Singleton getInstance() {
		return instance;
	}
	
	/**第二种实现方法*/
	/**
	 * 同样私有化构造函数创建静态变量
	 * 但在工厂方法调用时才加载类并且加入同步锁
	 * 优点:不会因为多线程而多次加载造成多个实例
	 * 缺点:反应速度慢
	 */
	private static Singleton instance1 = null;
	
	
	public static synchronized Singleton getInstance1() {
		if(instance1 == null){
			instance1 = new Singleton();
		}
		return instance1;
	}

	/**单粒的第三种形式*/
	public static final Singleton SINGLETON = new  Singleton();

	private Singleton(){

	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}
但是我们可以看出上面的单例模式的失去了多态性。

GOF种认为用注册表的方式来实现是最好的一种方式。

/**
 * 
 */
package com.model.singleton;

import java.util.HashMap;

/**
 * @author Administrator
 *单例模式注册表实现方式
 */
public class SingletonMap {

	private static HashMap sinRegistry = new HashMap();
	private static SingletonMap s = new SingletonMap();
	
	//建立受保护的构造方法可以让子类继承并重写
	protected  SingletonMap() {
	
	}
	
	public static SingletonMap getInstance(String className){
		if(className == null)
			className = "Singleton";
		if(sinRegistry.get(className)==null){
			try {
				sinRegistry.put(className, Class.forName(className).newInstance());
				
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return (SingletonMap) sinRegistry.get(className);
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

/**
 * 
 */
package com.model.singleton;

/**
 * @author Administrator
 *
 */
public class SingletonMapChildren extends SingletonMap {
	
	public SingletonMapChildren(){
		
	}
	
	static public SingletonMapChildren getInstance(){
		return (SingletonMapChildren) SingletonMap.getInstance("SingletonMapChildren");
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值