在《JAVA与模式》中,讨论了一种登记单式的单例模式,目的是为了能够继承,我没有太看明白书中所说的继承是为了继承“单例”的特性还是为了继承那个能够实现单例特性的Class的其他特性。反正在书里的代码里,子类的构造函数必须是public的,这样的类当然可以被new一个新的实例,因此有不少问题。
我于是打算自己做个例子,目的如下:
1、单例的特性与一般对象的特性分开
2、需要单例的对象,都不能被new
3、不要有多余的开销。
在一般的例子中,构造函数要么是public,要么是private,其实他也可以是protected的。于是我在系统中建一个signlaton包,这个包里只有一个类GetSignlaton可以通过getInstance()对外提供自己的实例,其他的对象,则需要通过这个GetSignlaton得到。
代码如下:
//管理单例类 package signlaton; import java.util.Hashtable; public class GetSignlaton { private static GetSignlaton gs; private static Hashtable ObjList; private GetSignlaton(){} public static GetSignlaton getInstance(){ if(gs==null){ gs=new GetSignlaton(); } return gs; } public Object getObj(String name){ if(ObjList==null){ ObjList=new Hashtable(); } if(ObjList.get(name)==null){ try{ ObjList.put(name,Class.forName("signlaton."+name).newInstance()); } catch(Exception e){ } } return ObjList.get(name); } }
//某一个具体的单例类 package signlaton; public class SignObj { private String t=""; protected SignObj(){} public void setT(String v){ t=v; } public String getT(){ return t; } }
//测试类 package test; import signlaton.*; public class SignTest { public static void main(String[] args) { GetSignlaton gs=GetSignlaton.getInstance(); SignObj so=(SignObj)gs.getObj("SignObj"); so.setT("123"); System.out.println(so.getT()); SignObj so2=(SignObj)gs.getObj("SignObj"); so2.setT("1234"); System.out.println(so.getT()); System.out.println(so2.getT()); } }
|