|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你通过从书的数量和开发周期及运行速度来证明:net和ruby要比java简单。计划本文先容了计划形式中Singleton的基础观点,对其功效和用处举行了复杂的剖析,列出了一般完成Singleton的几种办法,并给出了具体的Java代码.
基础观点
Singleton是一种创立性模子,它用来确保只发生一个实例,并供应一个会见它的全局会见点.对一些类来讲,包管只要一个实例是很主要的,好比有的时分,数据库毗连或Socket毗连要遭到必定的限定,必需坚持统一工夫只能有一个毗连的存在.再举个例子,汇合中的set中不克不及包括反复的元素,增加到set里的对象必需是独一的,假如反复的值增加到set,它只承受一个实例.JDK中正式使用了Singleton形式来完成set的这一特征,人人能够检察java.util.Collections里的外部静态类SingletonSet的原代码.实在Singleton是最复杂但也是使用最普遍的形式之一,在JDK中到处可见.
复杂剖析
为了完成Singleton形式,我们必要的是一个静态的变量,可以在不创立对象的情形下影象是不是已发生过实例了.静态变量或静态办法都能够在不发生详细实例的情形下间接挪用,如许的变量或办法不会由于类的实例化而有所改动.在的布局中能够看到,uniqueInstance就是这个自力的静态变量,它能够影象对象是不是已实例化了,在静态办法Instance中对这个变量举行判别,若没有实例化过就发生一个新的对象,假如已实例化了则不再发生新的对象,仍旧前往之前发生的实例.
<br>
:Singleton形式布局
详细实行
完成Singleton形式的举措一般有三种.
一.用静态办法完成Singleton
这类办法是利用静态办法来监督实例的创立.为了避免创立一个以上的实例,我们最好把机关器声明为private.
如许能够避免客户程序员经由过程除由我们供应的办法以外的恣意体例来创立一个实例,假如不把机关器声明为private,编译器就会自作伶俐的主动同步一个默许的friendly机关器.这类完成办法是最多见的,也就是中布局的尺度完成.
publicclassSingleton{
privatestaticSingletons;
privateSingleton(){};
/**
*Classmethodtoaccessthesingletoninstanceoftheclass.
*/
publicstaticSingletongetInstance(){
if(s==null)
s=newSingleton();
returns;
}
}
//测试类
classsingletonTest{
publicstaticvoidmain(String[]args){
Singletons1=Singleton.getInstance();
Singletons2=Singleton.getInstance();
if(s1==s2)
System.out.println("s1isthesameinstancewiths2");
else
System.out.println("s1isnotthesameinstancewiths2");
}
}
singletonTest运转了局是:
s1isthesameinstancewiths2
这证实我们只创立了一个实例.
二.以静态变量为标记完成Singleton
在类中嵌进一个静态变量做为标记,每次都在进进机关器的时分举行反省.
成绩在于机关器没有前往范例,假如断定创立一个实例乐成与否.一个办法是挪用一个函数来反省创立是不是乐成,然后复杂的前往一个来自静态变量的值,可是如许做是不文雅的,并且简单产生毛病.对照好的做法是创立一个当创立了一个以上的实例时能够抛出非常的类,这个类仅仅是挪用父类办法,优点是用了本人定名的非常范例,毛病信息加倍明晰:
classSingletonExceptionextendsRuntimeException{
publicSingletonException(Strings){
super(s);
}
}
classSingleton{
staticbooleaninstance_flag=false;//trueif1instance
publicSingleton(){
if(instance_flag)
thrownewSingletonException("Onlyoneinstanceallowed");
else
instance_flag=true;//setflagfor1instance
}
}
//测试类
publicclasssingletonTest{
staticpublicvoidmain(Stringargv[]){
Singletons1,s2;
//createoneincetance--thisshouldalwayswork
System.out.println("Creatingoneinstance");
try{
s1=newSingleton();
}catch(SingletonExceptione){
System.out.println(e.getMessage());
}
//trytocreateanotherspooler--shouldfail
System.out.println("Creatingtwoinstance");
try{
s2=newSingleton();
}catch(SingletonExceptione){
System.out.println(e.getMessage());
}
}
}
singletonTest运转了局是:
Creatingoneinstance
Creatingtwoinstance
Onlyoneinstanceallowed
能够看出,第一个实例顺遂创立,第二个实例创立实抛出了我们自界说的非常.
三.用注册器机制来创立Singleton
起首用汇合中的Hashtable和Enumeration来完成addItem(Objectkey,Objectvalue),getItem(Objectkey),,removeItem(Objectkey)等办法完成一个办理器,将key和value逐一联系关系起来,客户程序员创立实例前起首用addItem办法举行注册,再用getItem办法猎取实例.Hashtable中的key是独一的,从而包管创立的实例是独一的,详细完成限于篇幅不再细说,在Prototype模子的使用一文中我将会给出一个完成注册器的代码.用注册器机制来创立Singleton形式的优点是易于办理,能够同时把持多个分歧范例的Singleton实例.
小结
1.Singleton形式能够便利的举行扩大,发生指定命目标实例.
2.在TheDesignPatternsJavaCompanion一书中曾提到过用静态类的体例来完成Singleton形式,并指出java.lang.Math就是一个例子,这里我其实不暗示赞成,由于Math并非一个真实的对象,我们只是间接挪用Math类所包装的静态办法罢了,基本就没有创立实例的历程,又从何提及只发生一个实例呢?这个成绩我曾到Javaranch的论坛上发过帖子,一切回帖的人也都是对这一概念持否认立场.
3.在多线程的程序中,singleton大概会变的不成靠,大概会呈现多个实例,办理的举措很复杂,加个同步润色符:publicstaticsynchronizedSingletongetInstance().如许就包管了线程的平安性.
4.最初要说的是人人大概会瞥见一些其他完成Singleton形式的办法,由于形式在详细的使用时是天真的,不是刻舟求剑的,并没有一个流动的做法,但多数是下面几种办法的变形.
C++编译的是本地码,优点是启动快,而且可以精确控制资源因此可以开发很高效的程序.缺点是编程麻烦,而且容易留下安全隐患.跨平台靠源代码在各个平台间分别编译(一处编写到处编译) |
|