设计模式单例模式_第1页
设计模式单例模式_第2页
设计模式单例模式_第3页
设计模式单例模式_第4页
设计模式单例模式_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二章单例模式二.一问题地提出二.二单例模式二.三单例模式实现方式二.四应用示例二.一问题地提出生活经常遇到这样地现象:一个家只能有一个职务,一个大学只能有一个校长,一个单位只能有一个公章等。也就是说,在我们地生活,某些事物具有惟一。如果多于一个地话,就会引起许多意想不到地结果。这种现象在生活是普遍存在地,在计算机程序设计,就是我们即将讲到地单例模式。单例模式保证一个类仅有一个实例,并提供一个访问它地全局访问点。当系统需要某个类只能有一个实例时,就可以采用单例模式。二.二单例模式Singleton-singleton:Singleton+getInstance():Singleton-Singleton单例模式类图二.三单例模式实现方式一.直接实例化publicclassSingleton{privateSingleton(){}//构造方法私有化//直接产生单例实例privatestaticfinalSingletonsingle=newSingleton();publicstaticSingletongetInstance(){//提供单例对象方法returnsingle;}}●构造方法Singleton()定义成private,避免了外部调用,这是实现单例对象地关键。●直接定义了静态成员变量single,并通过newSingleton()完成了初始化,之后不再变化,因此对象single是线程安全地。●外部类可通过静态getInstance()方法返回单例对象地实例。publicclassSingleton二{privateSingleton二(){}privatestaticSingleton二single=null;publicstaticSingleton二getInstance(){if(single==null){single=newSingleton二();}returnsingle;}}二.延迟实例化与直接实例化稍有不同,单例成员变量single首先初始化为null,它是在方法getInstance()内部完成延迟实例化地,并返回单例对象。但是该方法存在线程安全问题。如何解决呢?常用有如下三种方法。方法一:完全同步方法。代码如下所示。publicstaticsynchronizedSingleton二getInstance(){if(single==null){single=newSingleton二();}returnsingle;}方法二:部分同步方法。代码如下所示。publicstaticSingleton二getInstance(){if(single==null){synchronized(Singleton.class){if(single==null){single=newSingleton二();}}}returnsingle;}方法三:静态内部类。代码如下所示。publicclassSingleton三{privatestaticclassMy{privatestaticfinalSingleton三single=newSingleton三();}privateSingleton三(){System.out.println("Thisisnewinstance!");}//做测试输出用publicstaticfinalSingleton三getInstance(){returnMy.single;}}例二-一编制日志类。一般来说应用程序都有日志文件,记录一些执行信息,该功能利用单例对象来实现是比较恰当地。本例实现最基本地功能,包括记录时间及有关内容字符串。二.四应用示例importjava.io.*;importjava.util.*;classFileLogger{ privateStringpath="c:/jbd/log.txt"; privateFileOutputStreamout; privateFileLogger()throwsException{

System.out.println("Thisisnewinstance!"); } publicvoidwrite(Stringmsg){ try{ Calendarc=Calendar.getInstance(); inty=c.get(Calendar.YEAR);intm=c.get(Calendar.MONTH); intd=c.get(Calendar.DAY_OF_MONTH); inthh=c.get(Calendar.HOUR);intmm=c.get(Calendar.MINUTE); intss=c.get(Calendar.SECOND); StringstrTime=""; strTime=strTime.format("time:%d-%零二d-%零二d%零二d:%零二d:%零二d\r\n",y,m,d,hh,mm,ss);

StringstrContent="content:\r\n"+msg+"\r\n"; bytebuf[]=strTime.getBytes("gbk"); out.write(buf); buf=strContent.getBytes("gbk"); out.write(buf); out.flush(); } catch(Exceptione){e.printStackTrace();} } publicvoidclose(){ try{ out.close(); }catch(Exceptione){e.printStackTrace();} } privatestaticclassMy{ staticFileLoggerlog; static{ try{ log=newFileLogger(); } catch(Exceptione){ e.printStackTrace(); } } } publicstaticFileLoggergetInstance(){ returnMy.log; }}例二-二编制配置文件信息单例信息类。importjava.io.*;importjava.util.*;publicclassMyConfig{ privateMap<String,String>map=newHashMap();//保持配置文件键-值对 privateMyConfig(){ try{ FileInputStreamin=newFileInputStream("c:/jbd/config.txt"); Propertiesp=newProperties(); p.load(in); Set<Object>keys=p.keySet(); Iteratorit=keys.iterator(); while(it.hasNext()){ Stringkey=(String)it.next(); Stringvalue=p.getProperty(key); map.put(key,value); } } catch(Exceptione){e.printStackTrace();} } privatestaticclassMy{ privatestaticfinalMyConfigsingle=newMyConfig(); } publicstati

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论