<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[通过什么样的方式才能保证我们的类在内存中只能创建出一个实例对象？ 单例。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Php/Js/Shell/Go]]></category>
<pubDate>Thu, 31 Jan 2013 03:49:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	单例模式，也叫单态模式<br/>Singleton模式主要作用是保证在Java应用程序中，一个类Class只有一个实例存在。 <br/><br/>在很多操作中，比如建立目录 数据库连接都需要这样的单线程操作。<br/><br/>还有, singleton能够被状态化; 这样，多个单态类在一起就可以作为一个状态仓库一样向外提供服务，比如，你要论坛中的帖子计数器，每次浏览一次需要计数，单态类能否保持住这个计数，并且能synchronize的安全自动加1，如果你要把这个数字永久保存到数据库，你可以在不修改单态接口的情况<br/>下方便的做到。<br/><br/>另外方面，Singleton也能够被无状态化。提供工具性质的功能，<br/><br/>Singleton模式就为我们提供了这样实现的可能。使用Singleton的好处还在于可以节省内存，因为它限制了实例的个数，有利于Java垃圾回收（garbage collection）。<br/><br/>我们常常看到工厂模式中类装入器(class loader)中也用Singleton模式实现的,因为被装入的类实际也属于资源。<br/><br/>一般Singleton模式通常有几种形式:<br/><br/>public class Singleton &#123;<br/><br/>　　private Singleton()&#123;&#125;<br/><br/>　　//在自己内部定义自己一个实例，是不是很奇怪？<br/>　　//注意这是private 只供内部调用<br/><br/>　　private static Singleton instance = new Singleton();<br/><br/>　　//这里提供了一个供外部访问本class的静态方法，可以直接访问　　<br/>　　public static Singleton getInstance() &#123;<br/>　　　　return instance; 　　<br/>　　 &#125; <br/>&#125; <br/><br/><br/><br/><br/>第二种形式:<br/><br/>public class Singleton &#123; <br/>　　private static Singleton instance = null;<br/><br/>　　public static synchronized Singleton getInstance() &#123;<br/><br/>　　if (instance==null)<br/>　　　　instance＝new Singleton();<br/>　　return instance; 　　&#125; <br/><br/>&#125; <br/><br/><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/><br/>总之：如果你的应用基于容器，那么Singleton模式少用或者不用，可以使用相关替代技术。<br/><br/><br/><br/>来自：http://www.dowhile.net/forum.php?mod=viewthread&amp;tid=497<br/>百度有一篇文章，使用单例模式内存中保存数据可提高数据处理速度，Url：http://wenku.baidu.com/view/c0d6f78cb9d528ea81c779a0.html<br/><br/>PHP的单例模式：<br/>http://blog.sina.com.cn/s/blog_6dbbafe001018w7r.html<br/>http://blog.csdn.net/jungsagacity/article/details/7618587<br/>http://www.cnblogs.com/mo-beifeng/archive/2012/02/21/2362332.html<br/>PHP的单例实现如下：<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
/**
* 设计模式之单例模式
* $_instance必须声明为静态的私有变量
* 构造函数和析构函数必须声明为私有,防止外部程序new
* 类从而失去单例模式的意义
* getInstance()方法必须设置为公有的,必须调用此方法
* 以返回实例的一个引用
* ::操作符只能访问静态变量和静态函数
* new对象都会消耗内存
* 使用场景:最常用的地方是数据库连接。
* 使用单例模式生成一个对象后，
* 该对象可以被其它众多对象所使用。
*/
class Danli &#123;

//保存类实例的静态成员变量
private static $_instance;

//private标记的构造方法
private function __construct()&#123;
echo &#039;This is a Constructed method;&#039;;
&#125;

//创建__clone方法防止对象被复制克隆
public function __clone()&#123;
trigger_error(&#039;Clone is not allow!&#039;,E_USER_ERROR);
&#125;

//单例方法,用于访问实例的公共的静态方法
public static function getInstance()&#123;
if(!(self::$_instance instanceof self))&#123;
self::$_instance = new self;
&#125;
return self::$_instance;
&#125;

public function test()&#123;
echo &#039;调用方法成功&#039;;
&#125;

&#125;

//用new实例化private标记构造函数的类会报错
//$danli = new Danli();

//正确方法,用双冒号::操作符访问静态方法获取实例
$danli = Danli::getInstance();
$danli-&gt;test();

//复制(克隆)对象将导致一个E_USER_ERROR
$danli_clone = clone $danli;
</textarea><br/>Run Result：<br/>This is a Constructed method;调用方法成功<br/>( ! ) Fatal error: Clone is not allow! in D:&#92;wamp&#92;www&#92;aaa&#92;danli.php on line 27
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] 通过什么样的方式才能保证我们的类在内存中只能创建出一个实例对象？ 单例。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>