版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第二章单例模式二.一问题地提出二.二单例模式二.三单例模式实现方式二.四应用示例二.一问题地提出生活经常遇到这样地现象:一个家只能有一个职务,一个大学只能有一个校长,一个单位只能有一个公章等。也就是说,在我们地生活,某些事物具有惟一。如果多于一个地话,就会引起许多意想不到地结果。这种现象在生活是普遍存在地,在计算机程序设计,就是我们即将讲到地单例模式。单例模式保证一个类仅有一个实例,并提供一个访问它地全局访问点。当系统需要某个类只能有一个实例时,就可以采用单例模式。二.二单例模式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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 防校园欺凌主题班会
- 2026年造价工程师考试工程经济案例分析培训试卷
- 2026年自学考试农业经济管理专业农业经济学冲刺押题卷
- 2026年银行业专业人员职业资格考试中级金融市场营销冲刺押题试卷
- 2026暖通工面试题及答案
- 2026普洱茶公司面试题及答案
- 2026青年返乡面试题目及答案
- 2026人才工作者面试题及答案
- 2026山东高校面试题目及答案
- 2026社会学类面试题及答案
- MySQL数据库应用实验训练参考答案
- 人教版六年级数学上册各单元知识点专项训练练习题及易错题专项训练题含答案解析
- 口腔局部麻醉课件
- (高清版)DB42∕T 2133-2023 建筑施工侧埋式悬挑脚手架技术规程
- 软件定义网络技术与实践智慧树知到期末考试答案章节答案2024年深圳信息职业技术学院
- 报表模板-土地增值税清算申报表(自动计算申报表)可填写数据
- 广外学生管理手册
- 干部人事档案管理业务培训班课件
- 2022年浙江绍兴市柯桥区部分机关事业单位编外和国有企业工作人员招聘笔试备考题库及答案解析
- 0兆瓦风力发电机组测量传感器与模块
- 国家临床重点专科评标准(耳鼻喉科)
评论
0/150
提交评论