单例模式的一点延伸

单例的实现:通过将构造方法的私有化,使得对象构建过程的调用被类完全直接管理。

先贴一个最简单的eager:
package com.shy2850;

public class Singleton {

	private static Singleton singleton = new Singleton();
	
	public static Singleton getInstence(){
		return singleton;
	}
	
	private Singleton() {
	}
}

之所以叫它eager就是因为只要类完成了加载,不管实例对象用还是不用都得创建。
然后就是区别于eager的lazyer了:
package com.shy2850;

public class Singleton {

	private static Singleton singleton;
	
	public static Singleton getInstence(){
		if(null == singleton)singleton = new Singleton();
		return singleton;
	}
	
	private Singleton() {
	}

}


“构造方法的私有化”带来的‘后遗症’就是:当前类无法被继承。
原因是什么?稍稍想想就明白了。。。。
在构造子类对象是必须先构建父类的对象(即:要调用到父类的构造方法)。

讲到java的设计模式,一般都会谈到Singleton,就是因为它简单,但是并不代表它不能稍作扩展,比如现在我们需要的是一个只能创建完成5个对象的'Fivton':
package com.shy2850;

public class Fivton {
	
	private static Fivton[] fivtons;
	static{init();}
	private static void init(){
		fivtons = new Fivton[5];
		for (int i = 0; i < fivtons.length; i++) {
			fivtons[i] = new Fivton();
		}
	}
	
	public static Fivton getIntence(int i){
		return fivtons[i%5];
	}
	
	private Fivton() {
	}

}


用数组来存储生成的实例对象是比较简单的一种模式;
当然,用别的种类的集合来完成存储对象也是合适的。

从Fivton中我们得到获取指定对象是是通过对象的int类型索引来获取的,但是如果我们把这里的索引类型换成引用类型,比如说String,那么这样来获取对象岂不是更加目标明确而且非常灵活?

package com.shy2850;

import java.util.HashMap;
import java.util.Map;

public class BeanFactory {
	
	private String value;
	private static Map<String, BeanFactory> map = new HashMap<String, BeanFactory>();
	static{init();}
	
	private static void init(){
		map.put("ok", new BeanFactory("ok"));
		map.put("pipa", new BeanFactory("pipa"));
		map.put(new String(), new BeanFactory(""));
	}
	
	public static BeanFactory getIntence(String key){
		return map.get(key);
	}
	
	private BeanFactory(String value){
		this.value = value;
	}
 
	public String toString() {
		return "BeanFactory[value="+value+"]";
	}
	
}

END.


你可能感兴趣的:(java,设计模式)