动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息



本月文章推荐
.java defunct产生的原因和解决办.
.FlashLite与J2ME的全方位分析比较.
.Thinking in Java第三版读书笔记.
.Jakarta Struts学习之应用实践.
.Java 数据类型 和 与String之间的.
.JAVA入门教程:运算符和表达式.
.控制反转(Inversion of Control.
.int、char、double与byte相互转换.
.用Java绘制K线图.
.开发java 工具集.
..NET 对 J2EE[2].
.Java语言的Socket编程.
.驯服Tiger之深入研究枚举类型.
.怎样为JAVA应用程序设置时间区.
.java 类基础.
.分享:用Struts上传多个文件的方法.
.HelloWorld 攻略.
.使用J2SE API读取Properties文件.
.Java工具完全安装手册.
.HTTP请求头概述.

Java模式设计之单例模式(四)

发表日期:2008-1-5 |



  不完全的单例类

  什么是不完全的单例类

  估计有些读者见过下面这样的“不完全”的单例类。

  代码清单10:“不完全”单例类

package com.Javapatterns.singleton.demos;
public class LazySingleton
{
private static LazySingleton
m_instance = null;
/**
* 公开的构造子,外界可以直接实例化
*/
public LazySingleton() { }
/**
* 静态工厂方法
* @return 返还LazySingleton 类的惟一实例
*/
synchronized public static
LazySingleton getInstance()
{
if (m_instance == null)
{
m_instance = new LazySingleton();
}
return m_instance;
}
}
  上面的代码乍看起来是一个“懒汉”式单例类,仔细一看,发现有一个公开的构造子。由于外界可以使用构造子创建出任意多个此类的实例,这违反了单例类只能有一个(或有限个)实例的特性,因此这个类不是完全的单例类。这种情况有时会出现,比如javax.swing.TimerQueue 便是一例,关于这个类,请参见《Java与模式》一书中的“观察者模式与Swing 定时器” 一章。

  造成这种情况出现的原因有以下几种可能:

  (1) 初学者的错误。许多初学者没有熟悉到单例类的构造子不能是公开的,因此犯下这个错误。有些初学Java 语言的学员甚至不知道一个Java 类的构造子可以不是公开的。在 这种情况下,设计师可能会通过自我约束,也就是说不去调用构造子的办法,将这个不完全的单例类在使用中作为一个单例类使用。

  在这种情况下,一个简单的矫正办法,就是将公开的构造子改为私有的构造子。

  (2) 当初出于考虑不周,将一个类设计成为单例类,后来发现此类应当有多于一个的实例。为了弥补错误, 干脆将构造子改为公开的,以便在需要多于一个的实例时, 可以随时调用构造子创建新的实例。要纠正这种情况较为困难,必须根据具体情况做出改进的决定。假如一个类在最初被设计成为单例类,但后来发现实际上此类应当有有限多个实例,这时候应当考虑是否将单例类改为多例类(Multiton)。

  (3)设计师的Java 知识很好,而且也知道单例模式的正确使用方法,但是还是有意使用这种不完全的单例模式,因为他意在使用一种“改良”的单例模式。这时候, 除去共有的构造子不符合单例模式的要求之外,这个类必须是很好的单例模式。

  默认实例模式

  有些设计师将这种不完全的单例模式叫做“默认实例模式”(Default Instance Pattern)。在所谓的“ 默认实例模式”里面, 一个类提供静态的方法,如同单例模式一样, 同时又提供一个公开的构造子,如同普通的类一样。

  这样做的惟一好处是,这种模式答应客户端选择如何将类实例化:创建新的自己独有的实例,或者使用共享的实例。这样一来,由于没有任何的强制性措施,客户端的选择不一定是合理的选择。其结果是设计师往往不会花费时间在如何提供最好的选择上,而是不恰当地将这种选择交给客户端的程序员,这样必然会导致不理想的设计和欠考虑的实现。

  本文建议读者不要这样做。 相关模式

  有一些模式可以使用单例模式,如抽象工厂模式可以使用单例模式,将具体工厂类设计成单例类;建造模式可以使用单例模式,将具体建造类设计成单例类。

  多例(Multiton)模式

  正如同本章所说的,单例模式的精神可以推广到多于一个实例的情况。这时候这种类叫做多例类,这种模式叫做多例模式。单例类(左)和多例类(右)的类图如下所示。

Java模式设计之单例模式(四)(图一)

  关于多例模式,请见《Java与模式》一书中的“专题:多例(Multiton)模式与多语言支持”一章。

  简单工厂(Simple Factory)模式

  单例模式使用了简单工厂模式(又称为静态工厂方法模式)来提供自己的实例。在上面ConfigManager 例子的代码中, 静态工厂方法getInstance() 就是静态工厂方法。在java.awt.Toolkit 类中,getDefaultToolkit() 方法就是静态工厂方法。简单工厂模式的简略类图如下所示。

Java模式设计之单例模式(四)(图二)

  本章讨论了单例模式的结构和实现方法。

  单例模式是一个看上去很简单的模式,很多设计师最先学会的往往是单例模式。然而,随着Java 系统日益变得复杂化和分散化,单例模式的使用变得比过去困难。本书提醒读者在分散式的Java 系统中使用单例模式时,尽量不要使用有状态的。

  问答题

  1. 为什么不使用一个静态的“全程”原始变量,而要建一个类?一个静态的原始变量当然只能有一个值,自然而然不就是“单例”的吗?

  2. 举例说明如何调用EagerSingleton 类。

  3. 举例说明如何调用RegSingleton 类和RegSingletonChild 类。

  4. 请问java.lang.Math 类和java.lang.StrictMath 类是否是单例模式?

  5. 我们公司只购买了一个JDBC 驱动软件的单用户使用许可,可否使用单例模式治理通过JDBC 驱动软件连接的数据库?

上一篇:XDE中模式驱动的设计与开发(二) 人气:276
下一篇:用Spring更好地处理Struts动作三种整合 人气:310
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-9 顶级域名交易系统 v3.0 完整版
2008-7-9 ACTCMS网站管理系统 v2.0 Build
2008-7-9 Roclog v3.1.4 build 20080706
2008-7-9 乐彼网上开店系统(56770 Eshop)
2008-7-9 深度学习alexa排名提升专家 v1.0
2008-7-9 BBSXP 2008 Build 8.0.5 正式版
2008-7-9 一句话快速信息发布系统 修正完美
2008-7-9 ACTCMS网站管理系统 v2.0 Build
2008-7-9 乐涛涛留言本 08版
2008-7-5 AgileMessenger即时通讯工具 v1.
2008-7-5 GoodCalculator2.0版固件计算器
2008-7-5 RepoName源地址搜索工具 v1.21b
2008-7-5 AgileMessenger即时通讯工具 v1.
2008-7-5 TouchCopy多媒体管理软件 v3.13完
2008-7-5 VideosTone视频铃声 v1.1汉化破解
2008-7-5 TouchPad触摸板 v4.44破解版
2008-7-5 VideosTone破解补丁 v1.0
2008-7-5 Feeds GoogleReader客户端 v0.4.3


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報