如何使用Java Singleton模式

[不指定 2008/08/02 16:14 | by ipaddr ]

Java Singleton模式属于管理实例化过程的设计模式家族。Singleton是一个无法实例化的对象。这种设计模式暗示,在任何时候,只能由JVM创建一个Singleton(对象)实例。
如果实例不存在,你通过创建类的新实例的方法建立一个类来执行这个模式;如果存在类的一个实例,就只会返回那个对象的一个引用。

Singleton模式的运行机制

以下是Singleton模式的一个典型例子:

public class Singleton {

        private final static Singleton INSTANCE = new Singleton(); 

    // Private constructor suppresses generation of

    // a (public) default constructor

    private Singleton() {} 

    public static Singleton getInstance() {

      return INSTANCE;

    }

 }

标准的Singleton模式并不使用直接静态变量实例化进行声明——它实例化构造器中的一个静态实例变量,而不查看它是否已经存在:

public class ClassicSingleton {

    private static ClassicSingleton INSTANCE = null;

    private ClassicSingleton() {

       // Exists only to defeat instantiation.

    }

    public static ClassicSingleton getInstance() {

       if(INSTANCE == null) {

          INSTANCE = new ClassicSingleton();

       }

       return INSTANCE;

    }

 }

Singleton类的默认构造器被设为私有,这样做可防止其它类使用new关键字直接将对象实例化。对返回Singleton对象的实例方法应用一个静态修饰符,这使得它成为一个类级方法,不创建对象即可进行访问。

何时需要使用Singleton

当你只需要一个类实例时,Singleton才真正有用;如果类拥有几个实例,使用Singleton就不再适用。

设计系统时,你通常希望控制对象的用法,防止用户(包括你自己)复制对象或建立新实例。例如,你可以使用它创建一个连接池。每次程序需要往数据库中写入内容时才创建一个新连接的做法并不明智;相反,一个或一组已经在池中的连接就可以使用Singleton模式实例化。

Singleton模式常常和工厂方法模式一同使用,创建一个系统级资源,使用这个资源的代码并不知道它的特殊类型。抽象窗口工具包(AWT)就是组合使用这两个模式的典型例子。在GUI应用程序中,对每个应用程序实例,你一般只需要一个图形元素的实例,如打印(Print)对话框或OK按钮。

注意潜在的问题

虽然Singleton设计模式是最简单的设计模式之一,但它也存在一些缺陷。

多线程应用程序中的构造问题

在多线程应用程序中,你必须仔细构造Singleton模式。当Singleton不存在时,如果两个线程即将同时执行创建方法,这两个线程必须检查Singleton实例,但只有一个线程应当创建新对象。这个问题的典型解决办法就是对类使用相互排斥,指出对象正在被实例化。这是Singleton的一个线程安全的版本:

public class Singleton

 {

   // Private constructor suppresses generation

   //  of a (public) default constructor

   private Singleton() {} 

   private static class SingletonHolder

   {

     private final static Singleton INSTANCE = new Singleton();

   } 

   public static Singleton getInstance()

   {

     return SingletonHolder.INSTANCE;

   }

 }

另一个解决办法是在getInstance()方法声明中添加synchronized关键字:

  public static synchronized Singleton getInstance()

提前考虑克隆预防

你仍然可以使用对象的clone()方法克隆对象,建立一个Singleton对象。要禁用这一功能,你需要禁用对象的克隆方法,这产生一个CloneNotSupportedException例外。

      public Object clone() throws

CloneNotSupportedException {

         throw new CloneNotSupportedException();

}

考虑使singleton类位于最后

你可能希望将Singleton类放在最后,以避免Singleton的子类造成其它问题。

不要忘记垃圾收集

根据不同的执行,你的Singleton类和它的所有数据可能被当作垃圾收集。因此,在应用程序运行时,你必须保证存在一个Singleton类的实时引用。

结论

Singleton模块得到广泛地使用,并证实可用于软件设计。虽然这个模式并非Java专有,但它已成为Java编程的一个典型应用。尽管这个模式相当简单,但还是要记住我在本文中描述的Singleton模式的限制。

Vista下arp -s项添加失败

[不指定 2008/07/18 19:59 | by ipaddr ]

C:\\Users\\est>arp -s 202.115.22.129 00-0d-bc-78-07-3f
ARP 项添加失败: 5

C:\\Users\\est>netsh i i show in

Idx  Met   MTU   状态          名称
---  ---  -----  -----------  -------------------
  1   50 4294967295  connected    Loopback Pseudo-Interface 1
  8   20   1500  connected    本地连接

C:\\Users\\est>netsh -c "i i" add neighbors 8 "202.115.22.129" "00-0d-bc-78-07-3f"

C:\\Users\\est>arp -a

接口: 192.169.1.120 --- 0x8
  Internet 地址         物理地址              类型
  202.115.22.129        00-0d-bc-78-07-3f     静态
  202.115.22.131        00-17-a4-e2-07-3f     动态
  202.115.22.132        00-17-08-2e-78-41     静态
  202.115.22.135        00-01-02-fd-4c-d6     动态
  202.115.22.141        00-e0-5c-41-0d-98     动态
  202.115.22.148        00-f0-4c-85-f4-4e     动态
  202.115.22.149        00-0a-e4-fb-90-ac     动态
  202.115.22.154        00-0a-eb-4f-1c-e2     动态
  202.115.22.191        ff-ff-ff-ff-ff-ff     静态
  224.0.0.22            01-00-5e-00-00-16     静态

C:\\Users\\est>

SQL Backup

[不指定 2008/07/18 17:07 | by ipaddr ]
SQL Backup is the leading tool for creating, compressing and protecting your SQL Server backups. Compatible with SQL Server 2000 and 2005, it includes a range of features to make backups faster, simpler and more secure.

  • Save time – up to 10 times quicker* than native SQL Server backup and restore
  • Save space – compress database backups by up to 95%
  • Protect your data – use up to 256-bit AES encryption
  • Monitor your data – graphic visualization of activities to identify problems before they arise

  • http://www.red-gate.com/products/sql_backup/index.htm

     在使用url进行参数传递时,经常会传递一些中文名的参数或URL地址,在后台处理时会发生转换错误。在有些传递页面使用GB2312,而在接收页面使用UTF8,这样接收到的参数就可能会与原来发生不一致。使用服务器端的urlEncode函数编码的URL,与使用客户端javascript的encodeURI函数编码的URL,结果就不一样。

    如何在Firefox中强制重画页面

    [不指定 2008/06/24 16:17 | by ipaddr ]

    How to force firefox redraw ( admin.net [at] 163.com)

    Firefox中,有时会发现使用JS改变了一些表格的宽度或页面,但Firefox并没有重画,手动调整一下窗口大小后才正常。
    可以使用下面的代码,让Firefox强制重画网页:

        var objTemp=document.firstChild;
        if (objTemp)
        {
         //Tom Zhou (admin.net[at]163.com
         objTemp.style.width = objTemp.offsetWidth - 1;
         objTemp.style.width = objTemp.offsetWidth + 1;
        }

       

    如何在网页中显示邮件地址

    [不指定 2008/06/23 12:31 | by ipaddr ]

    如果将邮件地址直接显示在网页上的话,可能会被很多邮件扫描器扫到,接踵而来的是大量的垃圾邮件。
    垃圾邮件是一个复杂的课题,我个人认为已经超出了技术范畴了,垃圾邮件的防治也是比较麻烦的问题,如果你的邮件地址被垃圾邮件发送者得到的话,即使是Yahoo,Gmail,163,同样会有大量的垃圾邮件骚扰。所以,防治垃圾邮件的一个重要方法,就是不要在网站上公布你的邮件地址。
    目前,有效的做法有几种:
    1. 使用图片显示邮件地址,代替文本形式的Email地址 (请访问 http://www.makepic.com 生成图片形式的邮件地址)
    2. 邮件地址中不带@字符,例如:admin.net(At )163.com
    以下两种方式都有弊端,浏览者不可以直接复制邮件地址,也不可以直接点击发送邮件。

    另外一些方法,是使用Javascript来显示邮件地址,这样,在网页中没有username@domain.com形式的地址,通过Javascript来显示。Javascript如下:

    //Author: admin.net( AT )163.com http://www.eit.name/
    function displayEmail(userName,displayName,domainName,className) {
     var tmpEmail;
     if (userName.length==0 || domainName.length==0) return;
     if (displayName.length==0) displayName=userName+"@"+domainName;
     if (className.length>0) className=" class='"+className+"'";
     tmpEmail=userName+"@"+domainName;
     document.write("<a href='mailto:"+tmpEmail+"'"+className+">"+displayName+"</a>");
    }

    调用方法:

    <script language="javascript">displayEmail("admin.net","鱼漂","163.com","email");</script>

    使用这种方式,不影响浏览者的使用和显示,但却有效的防止邮件地址被扫描。

    最近安装了MindManager 7.1,安装完后,无法启动,总是提示"由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。"。按照网上的说法,MindManager 7.1是用VC2005 SP1编译的,我安装了VC2005 SP1的运行库,仍然不能解决问题。刚开始还怀疑是.net framewok的问题,重装过也没有效果。

    后来仔细想想,我的机器上已经安装了VC2005,但没有打到SP1,可能与有这关系,MindManager7.1首先找到了VC2005(没有sp1)的运行库运行,结果发现不匹配,所以报错。
    (鱼漂原创,转载请注明)

    于是,按下面的思路修复了此问题:
    1. 重新安装vc2005 sp1 runtime library (google搜索vc2005 sp1,即可以MS官方网站找到下载)
    2. 在C:\Windows目录,开始搜索"msvcr80.dll"文件,果然发现很多个版本的msvcr80.dll,其中,C:\Windows\system32目录下的应该是安装Visual Studio 2005(没有sp1)带过来的,不是sp1版本,而MindManager7.1首先会有这个版本启动,由于版本不匹配,所以启动失败。
    ### http://www.eit.name ###
    3. 解决方法,将vc20005sp1版本目录下的3个DLL文件,复制到MindManager7.1的安装目录即可,vc2005sp1 runtime library的安装目录为:
    C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700
    (版本号为8.0.50727.762)

    HTML2Image For Linux and Unix

    [不指定 2008/06/13 16:16 | by ipaddr ]

    Have you ever wanted a solution for converting html to image on Linux/Unix? Html2Image for Linux is a command line tool that can convert html to image on Linux or Unix platform.

    html2image linux now solves this problem. It is a standalone tool package that can generate raster image from html content. The html page can be on a remote server or local file disk. html2image can convert them into images on the fly.
      

    html2image can convert html to bmp, convert html to png and convert html to jpg. The URL and image file name can be specified on command line paramters, which is useful for batch processing a lot of html files. You can also call the command line program from your favourite programming languages like php or C++ in order to add html to image functionality to your server applications.

    You can also control the compression quality of the jpeg image by specifying the quality parameters on command line.

    http://www.guangmingsoft.net/htmlsnapshot/html2image.htm

    1、通用类:

    zamzar 是一个很牛的在线转换工具,能转换100M以下的到40种格式的文件,包括图象格式、文档格式、音频格式、视频格式等,几乎囊括了我们熟知的所有文件格式,可以自由转换,功能相当不错的了,可以说是一个比较全能的工具了,而且页面简洁易用,速度也很不错!!

    Youconvertit 提供堪称最完美的在线文件转换服务,能在线对文档、图片、音频以及视频文件进行转换。能在41种文档格式(常用如html,txt,ppt,doc,pdf,rtf,csv,psd,xls,xhtml,xls等)、85种图片格式(常用如bmp,jpg,gif,tiff,ico,png等)、7种音频格式(aac、aif、aiff、mp3、ra、wav、wma)、11种视频格式(3gp、asf、avi、flv、mov、mp4、mpeg、mpg、rm、swf、wmv)进行相互转换。实在是一项非常不错的服务。

    Xurrency 是在线的当前货币兑换查询工具,界面非常简单,选择币种,输入金额即可快速获得目标币种的数额。同时,底部还有一个实时的汇率表,直观的反馈一些主要币种的现时汇率。放在此类有些牵强,对一些朋友会很有用。


    [软件介绍]ByteOMeter & NetLimiter

    [不指定 2008/05/22 15:07 | by ipaddr ]


    ByteOMeter

    一款功能强大的带宽测试和监控软件,它可以测量和显示出你网络的所有流量,可以创建网络上所有计算机的流量的统计表格,测量和显示所有电脑从 Internet 下载和上传的流量,主要功能:
    1、用图形和数字显示带宽使用率
    2、自定义网络带宽可视化风格
    3、能显示所有的端口和网络适配器
    4、能显示所有的网络跟踪
    5、具有自动报警功能
    6、可生成基于端口和网卡的统计报表
    7、安装配置非常简单,支持LAN, WAN, VPN, ADSL, xDSL, Modem, Dial-Up等网络类型,可靠性高

    NetLimiter

    NetLimiter是一款运行在Windows 98/98SE/Me/2000/XP/2003/Vista上的网络流量控制软件。

    通过它,您可以直接来控制每个程序对Internet的访问以及流量分配情况。例如,您可以用NetLimiter来为单个程序甚至是单个网络连接限定其上载和下载速度。通过非常简单的设置,NetLimiter就可以让你随心所欲地在各个程序之间分配网络带宽。

    随着宽频网络的日益普及,使用P2P类下载软件(如:BT、迅雷、eDonkey、eMule..等等)的人越来越多,但是在使用此类软件时,通常会因他们的高速而「榨干」了我们有限的带宽,其他需要透过网络来联机的应用程序就几乎动弹不得了!有时想一边下载一边浏览网页都不行,蜗牛般的页面打开速度和极高速的文件下载速度总是让电脑使用者在一旁哭笑不得...

    NetLimiter它不仅可以控制某个应用程序的上传/下载使用带宽,还可以实时监控所其占用的带宽,甚至于,你可以限制你的电脑的总上传/下载带宽!网络速度分配完全随心所欲。不仅可以让你随心的分配有限的网络带宽,他还能帮你楸出占用你大量带宽的元凶呢~(例如某些木马、间谍程序、流氓软件、病毒等等),现在你可以通过他完全掌握你的网络传输情况了~

    分页: 23/57 第一页 上页 18 19 20 21 22 23 24 25 26 27 下页 最后页 [ 显示模式: 摘要 | 列表 ]