单例的实现:通过将构造方法的私有化,使得对象构建过程的调用被类完全直接管理。
先贴一个最简单的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.