首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

单例模式的1点延伸

2012-09-15 
单例模式的一点延伸单例的实现:通过将构造方法的私有化,使得对象构建过程的调用被类完全直接管理。先贴一个

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

先贴一个最简单的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.


热点排行