﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-dada2007</title><link>http://www.blogjava.net/dada2007/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 07 May 2026 05:17:12 GMT</lastBuildDate><pubDate>Thu, 07 May 2026 05:17:12 GMT</pubDate><ttl>60</ttl><item><title>转接</title><link>http://www.blogjava.net/dada2007/archive/2007/03/13/103621.html</link><dc:creator>大大</dc:creator><author>大大</author><pubDate>Tue, 13 Mar 2007 12:25:00 GMT</pubDate><guid>http://www.blogjava.net/dada2007/archive/2007/03/13/103621.html</guid><wfw:comment>http://www.blogjava.net/dada2007/comments/103621.html</wfw:comment><comments>http://www.blogjava.net/dada2007/archive/2007/03/13/103621.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dada2007/comments/commentRss/103621.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dada2007/services/trackbacks/103621.html</trackback:ping><description><![CDATA[
		<p>转接一篇，因为这篇文章确实写得好，<br /><br /><span class="tpc_content"><font size="2">java设计模式之Singleton(单态)<br /><br />定义:<br />Singleton模式主要作用是保证在Java应用程序中，一个类Class只有一个实例存在。 <br /><br />在很多操作中，比如建立目录 数据库连接都需要这样的单线程操作。<br /><br />还有, singleton能够被状态化; 这样，多个单态类在一起就可以作为一个状态仓库一样向外提供服务，比如，你要论坛中的帖子计数器，每次浏览一次需要计数，单态类能否保持住这个计数，并且能synchronize的安全自动加1，如果你要把这个数字永久保存到数据库，你可以在不修改单态接口的情况下方便的做到。<br /><br />另外方面，Singleton也能够被无状态化。提供工具性质的功能，<br /><br />Singleton模式就为我们提供了这样实现的可能。使用Singleton的好处还在于可以节省内存，因为它限制了实例的个数，有利于Java垃圾回收（garbage collection）。<br /><br />我们常常看到工厂模式中类装入器(class loader)中也用Singleton模式实现的,因为被装入的类实际也属于资源。<br /><br /><br />如何使用?<br />一般Singleton模式通常有几种形式:<br /><br /><br /></font></span></p>
		<div style="FONT-SIZE: 9px; MARGIN-LEFT: 5px">
				<b>CODE:</b>
		</div>
		<div class="quote" id="code1">
				<br />public class Singleton {　　<br />    private Singleton(){}　　<br />    //在自己内部定义自己一个实例，是不是很奇怪？　　<br />    //注意这是private 只供内部调用　　<br />    private static Singleton instance = new Singleton();　　<br />    //这里提供了一个供外部访问本class的静态方法，可以直接访问　　　　<br />    public static Singleton getInstance() {　　　　<br />      return instance; 　　　　 <br />  }     <br />} <br /></div>
		<div style="FONT-SIZE: 11px; MARGIN-LEFT: 5px">
				<a onclick="CopyCode(document.getElementById('code1'));" href="javascript:">[Copy to clipboard]</a>
		</div>
		<p>
				<br />
				<br />
				<br />
				<br />第二种形式:<br /><br /></p>
		<div style="FONT-SIZE: 9px; MARGIN-LEFT: 5px">
				<b>CODE:</b>
		</div>
		<div class="quote" id="code2">
				<br />public class Singleton { 　　<br />  private static Singleton instance = null;　　<br />  public static synchronized Singleton getInstance() {　　<br />  //这个方法比上面有所改进，不用每次都进行生成对象，只是第一次　　　 　　　<br />  //使用时生成实例，提高了效率！　　<br />  if (instance==null)　　　　<br />      instance＝new Singleton();　　<br />      return instance; 　　<br />  } <br />} <br /></div>
		<div style="FONT-SIZE: 11px; MARGIN-LEFT: 5px">
				<a onclick="CopyCode(document.getElementById('code2'));" href="javascript:">[Copy to clipboard]</a>
		</div>
		<p>
				<br />
				<br />
				<br />使用Singleton.getInstance()可以访问单态类。<br /><br />上面第二中形式是lazy initialization，也就是说第一次调用时初始Singleton，以后就不用再生成了。<br /><br />注意到lazy initialization形式中的synchronized，这个synchronized很重要，如果没有synchronized，那么使用getInstance()是有可能得到多个Singleton实例。关于lazy initialization的Singleton有很多涉及double-checked locking (DCL)的讨论，有兴趣者进一步研究。<br /><br />一般认为第一种形式要更加安全些。<br /><br /><br />使用Singleton注意事项：<br />有时在某些情况下，使用Singleton并不能达到Singleton的目的，如有多个Singleton对象同时被不同的类装入器装载；在EJB这样的分布式系统中使用也要注意这种情况，因为EJB是跨服务器，跨JVM的。<br /><br />我们以SUN公司的宠物店源码(Pet Store 1.3.1)的ServiceLocator为例稍微分析一下：<br /><br />在Pet Store中ServiceLocator有两种，一个是EJB目录下；一个是WEB目录下，我们检查这两个ServiceLocator会发现内容差不多，都是提供EJB的查询定位服务，可是为什么要分开呢？仔细研究对这两种ServiceLocator才发现区别：在WEB中的ServiceLocator的采取Singleton模式，ServiceLocator属于资源定位，理所当然应该使用Singleton模式。但是在EJB中，Singleton模式已经失去作用，所以ServiceLocator才分成两种，一种面向WEB服务的，一种是面向EJB服务的。<br /><br />Singleton模式看起来简单，使用方法也很方便，但是真正用好，是非常不容易，需要对Java的类 线程 内存等概念有相当的了解。<br /></p>
<img src ="http://www.blogjava.net/dada2007/aggbug/103621.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dada2007/" target="_blank">大大</a> 2007-03-13 20:25 <a href="http://www.blogjava.net/dada2007/archive/2007/03/13/103621.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>