仓酷云

标题: JAVA网页设计在Java中使用计划形式--Singleton [打印本页]

作者: 深爱那片海    时间: 2015-1-18 11:53
标题: JAVA网页设计在Java中使用计划形式--Singleton
你通过从书的数量和开发周期及运行速度来证明:net和ruby要比java简单。计划本文先容了计划形式中Singleton的基础观点,对其功效和用处举行了复杂的剖析,列出了一般完成Singleton的几种办法,并给出了具体的Java代码.

  基础观点

  Singleton是一种创立性模子,它用来确保只发生一个实例,并供应一个会见它的全局会见点.对一些类来讲,包管只要一个实例是很主要的,好比有的时分,数据库毗连或Socket毗连要遭到必定的限定,必需坚持统一工夫只能有一个毗连的存在.再举个例子,汇合中的set中不克不及包括反复的元素,增加到set里的对象必需是独一的,假如反复的值增加到set,它只承受一个实例.JDK中正式使用了Singleton形式来完成set的这一特征,人人能够检察java.util.Collections里的外部静态类SingletonSet的原代码.实在Singleton是最复杂但也是使用最普遍的形式之一,在JDK中到处可见.

  复杂剖析

  为了完成Singleton形式,我们必要的是一个静态的变量,可以在不创立对象的情形下影象是不是已发生过实例了.静态变量或静态办法都能够在不发生详细实例的情形下间接挪用,如许的变量或办法不会由于类的实例化而有所改动.在的布局中能够看到,uniqueInstance就是这个自力的静态变量,它能够影象对象是不是已实例化了,在静态办法Instance中对这个变量举行判别,若没有实例化过就发生一个新的对象,假如已实例化了则不再发生新的对象,仍旧前往之前发生的实例.

JAVA网页设计在Java中使用计划形式--Singleton
登录/注册后可看大图

<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++编译的是本地码,优点是启动快,而且可以精确控制资源因此可以开发很高效的程序.缺点是编程麻烦,而且容易留下安全隐患.跨平台靠源代码在各个平台间分别编译(一处编写到处编译)
作者: 精灵巫婆    时间: 2015-1-21 16:42
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
作者: 第二个灵魂    时间: 2015-1-24 17:51
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
作者: 乐观    时间: 2015-2-2 11:37
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
作者: 蒙在股里    时间: 2015-2-7 19:12
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
作者: 爱飞    时间: 2015-2-8 23:52
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
作者: 海妖    时间: 2015-2-10 23:44
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
作者: 飘灵儿    时间: 2015-2-23 09:26
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
作者: 变相怪杰    时间: 2015-2-24 02:52
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
作者: 因胸联盟    时间: 2015-3-3 21:13
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
作者: 不帅    时间: 2015-3-4 04:04
是一种使用者不需花费很多时间学习的语言
作者: 只想知道    时间: 2015-3-7 18:14
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
作者: 若相依    时间: 2015-3-12 13:55
你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。
作者: 仓酷云    时间: 2015-3-12 17:20
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
作者: 再现理想    时间: 2015-3-19 23:50
是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言
作者: 愤怒的大鸟    时间: 2015-3-29 17:20
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
作者: 深爱那片海    时间: 2015-4-11 11:29
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
作者: 柔情似水    时间: 2015-4-13 01:18
是一种为 Internet发展的计算机语言
作者: 活着的死人    时间: 2015-4-15 18:00
你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。
作者: 灵魂腐蚀    时间: 2015-4-21 06:06
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2