﻿<?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-我在云端-文章分类-一周一模式</title><link>http://www.blogjava.net/chinan/category/53465.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 31 Jul 2013 17:22:38 GMT</lastBuildDate><pubDate>Wed, 31 Jul 2013 17:22:38 GMT</pubDate><ttl>60</ttl><item><title>《JAVA与模式》之抽象工厂模式（转）</title><link>http://www.blogjava.net/chinan/articles/402071.html</link><dc:creator>何健超</dc:creator><author>何健超</author><pubDate>Sun, 28 Jul 2013 16:23:00 GMT</pubDate><guid>http://www.blogjava.net/chinan/articles/402071.html</guid><wfw:comment>http://www.blogjava.net/chinan/comments/402071.html</wfw:comment><comments>http://www.blogjava.net/chinan/articles/402071.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chinan/comments/commentRss/402071.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chinan/services/trackbacks/402071.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 《JAVA与模式》之抽象工厂模式本文转自：http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html&nbsp;（这是目前我看到的讲解抽象工厂模式最好的了）场景问题　　举个生活中常见的例子&#8212;&#8212;组装电脑，我们在组装电脑的时候，通常需要选择一系列的配件，比如CPU、硬盘、内存、主板、电源、机箱等。为讨论...&nbsp;&nbsp;<a href='http://www.blogjava.net/chinan/articles/402071.html'>阅读全文</a><img src ="http://www.blogjava.net/chinan/aggbug/402071.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chinan/" target="_blank">何健超</a> 2013-07-29 00:23 <a href="http://www.blogjava.net/chinan/articles/402071.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式第二周--桥接模式</title><link>http://www.blogjava.net/chinan/articles/397829.html</link><dc:creator>何健超</dc:creator><author>何健超</author><pubDate>Sun, 14 Apr 2013 18:27:00 GMT</pubDate><guid>http://www.blogjava.net/chinan/articles/397829.html</guid><wfw:comment>http://www.blogjava.net/chinan/comments/397829.html</wfw:comment><comments>http://www.blogjava.net/chinan/articles/397829.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chinan/comments/commentRss/397829.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chinan/services/trackbacks/397829.html</trackback:ping><description><![CDATA[桥接模式：<span style="margin: 0px; padding: 0px;"><strong>把抽象和实现解耦，使得它们可以独立地变化。十分常见，可能你已经用到了，但是还不知道它就是这种模式。<br /></strong>类图：<br /><img src="http://www.blogjava.net/images/blogjava_net/chinan/bridge.jpg" width="448" height="293" align="absMiddle" alt="" /><br /><br /><strong>举例：</strong><br /><div>&nbsp; &nbsp; &nbsp; &nbsp; 家里的家用电器，它们都是由开关控制的。假如电器是：电灯和电扇，而开关有圆形开关，方形开关等样式，那么电器与开关的组合方式，类似笛卡尔积。此外，任何时候，我们都可以在不更换开关的情况下换掉灯泡，也可以在不接触灯泡或者风扇的情况下更换开关，而不会存在灯和开关必须整体更换的情况。那么是怎么做到的呢？是通过电线来解耦的，我们在抽象这一问题时，虽然没有电线，但是有OOD的封装。</div><div>&nbsp; &nbsp; &nbsp; &nbsp; 可以定义抽象开关类：Switch，有待实现的方法：on()，off()，然后定义圆形开关CircleSwitch，SquareSwitch都继承自抽象Switch。同样我们抽象出IElectricalEquipment电器，有powOn(),powerOff()方法，然后定义点灯Light和电扇Fan类实现IElectricalEquipment接口。现在需要让电器与开关相连，可以采用：抽象类Switch中，持有IElectricalEquipment电器接口，也就是按照上面的类图可以实现电器与开关的解耦，并符合OCP原则。代码见：https://github.com/hejianchao/Patterns-in-Java 。<br /><br /><strong>推荐：</strong><br /><div>http://blog.163.com/xiaokangzhijia@126/blog/static/1659548562010111843618596/</div></div></span><img src ="http://www.blogjava.net/chinan/aggbug/397829.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chinan/" target="_blank">何健超</a> 2013-04-15 02:27 <a href="http://www.blogjava.net/chinan/articles/397829.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OOD 若干原则</title><link>http://www.blogjava.net/chinan/articles/397828.html</link><dc:creator>何健超</dc:creator><author>何健超</author><pubDate>Sun, 14 Apr 2013 17:40:00 GMT</pubDate><guid>http://www.blogjava.net/chinan/articles/397828.html</guid><wfw:comment>http://www.blogjava.net/chinan/comments/397828.html</wfw:comment><comments>http://www.blogjava.net/chinan/articles/397828.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chinan/comments/commentRss/397828.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chinan/services/trackbacks/397828.html</trackback:ping><description><![CDATA[面向对象设计，前人总结了五大原则，简称为：SOLID原则，具体如下：<br /><div></div><div>S （Single responsibility principle） = 单一责任原则：一个类有且只有一个职责。</div><div>O （Open closed principle）= 开闭原则：软件实体（类，模块，函数等）应该对扩展开放，对修改关闭。</div><div>L &nbsp;（Liscov substitution principle）= Liscov替换原则：子类型必须能够替换它们的基类，也就是使用基类引用的函数必须能够使用派生类而无须了解派生类</div><div>I &nbsp;（Interface segregation principle）= 接口隔离原则:用户不应该被迫依赖他们不使用的接口，接口只应该包括必要的方法而不是所有的</div><div>D （Dependency inversion principle））= 依赖倒置原则:高层次的模块不应该依赖于低层次的模块，而是，都应该依赖于抽象。<br /><br />其他若干原则：<br /><div>&#8220;组合替代继承&#8221;：用组合比用继承好;</div><div>&#8220;笛米特法则&#8221;：类对其它类知道的越少越好;</div><div>&#8220;共同封闭原则&#8221;：相关类应该一起打包;</div><div>&#8220;稳定抽象原则&#8221;：类越稳定，就越应该是抽象类;</div></div><div></div><img src ="http://www.blogjava.net/chinan/aggbug/397828.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chinan/" target="_blank">何健超</a> 2013-04-15 01:40 <a href="http://www.blogjava.net/chinan/articles/397828.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模式第一周--单例模式</title><link>http://www.blogjava.net/chinan/articles/397213.html</link><dc:creator>何健超</dc:creator><author>何健超</author><pubDate>Mon, 01 Apr 2013 01:38:00 GMT</pubDate><guid>http://www.blogjava.net/chinan/articles/397213.html</guid><wfw:comment>http://www.blogjava.net/chinan/comments/397213.html</wfw:comment><comments>http://www.blogjava.net/chinan/articles/397213.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chinan/comments/commentRss/397213.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chinan/services/trackbacks/397213.html</trackback:ping><description><![CDATA[阎宏博士的《JAVA与模式》定义的单例模式为：<p>　&nbsp;<strong>作为对象的创建模式，单例模式确保某一个类只有一个实例，而且自行实例化并向整个系统提供这个实例。这个类称为单例类。<br /></strong></p><hr />&nbsp; &nbsp; 按照此描述，单例模式属于设计模式中的创建模式，其特点是： 只能有一个实例；必须自己创建自己的唯一实例；必须给所有其他对象提供这一实例。<h3>单例模式常见实现方式：<br />　　<br />1、饿汉式<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;EagerSingleton&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;EagerSingleton&nbsp;instance&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp; EagerSingleton();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;默认私有构造方法<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;EagerSingleton(){}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;静态公共方法，取得实例的唯一入口<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;EagerSingleton&nbsp;getInstance(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;instance;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div></h3> <p>　　采用这种方式，在类<span style="font-size: 13px; font-weight: bold; background-color: #eeeeee;">EagerSingleton&nbsp;</span>被加载时，静态变量instance会被初始化，此时类的默认私有构造方法被调用，进而创建了单例实例。</p>  <p>　　<strong>饿汉式是典型的空间换时间</strong>，当类装载的时候就会创建类的实例，不管用或者不用，什么时候用，都会先创建出来，然后每次调用的时候，就不需要再判断，节省了运行时间。&nbsp;</p> <h3>2、懒汉式<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;LazySingleton&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;LazySingleton&nbsp;instance&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #008000;">默认私有构造方法</span><br /><span style="color: #008000; ">&nbsp; &nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;LazySingleton(){}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #008000;">&nbsp;静态公共方法，取得实例的唯一入口（注意：synchronized关键字）</span><br /><span style="color: #008000; ">&nbsp; &nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">synchronized</span>&nbsp;LazySingleton getInstance(){<br />&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(instance&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; instance&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;LazySingleton();<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;instance;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div></h3> <p>　　这种方式实现时，要注意<span style="font-size: 13px; font-weight: bold; background-color: #eeeeee;">getInstance()&nbsp;</span>需要同步，以应对多线程竞争。<br />　　<strong>懒汉式是典型的时间换空间</strong>。每次获取实例都会进行判断，看是否需要创建实例，会耗费判断时间。当然，如果一直没有人使用的话，就不会创建实例，则节约内存空间。</p> <p>　　由于懒汉式的实现是线程安全的，需要同步，并且每次都要判空，这样会降低整个访问的速度。那么有没有更好的方式实现呢？<br /></p>  <h3>3、双重检查加锁（double check lock）</h3> <p>　　所谓&#8220;双重检查加锁&#8221;机制，指的是：并不是每次进入getInstance方法都需要同步，而是先不同步，进入方法后，先检查实例是否存在，如果不存在才进行下面的同步块，这是第一重检查，进入同步块过后，再次检查实例是否存在，如果不存在，就在同步的情况下创建一个实例，这是第二重检查。这样一来，就只需要同步一次了，从而减少了多次在同步情况下进行判断所浪费的时间。</p> <p>　　&#8220;双重检查加锁&#8221;机制的实现会使用关键字volatile，它的意思是：被volatile修饰的变量的值，将不会被本地线程缓存，所有对该变量的读写都是直接操作共享内存，从而确保多个线程能正确的处理该变量。</p> <p><strong>　　注意：在java1.4及以前版本中，很多JVM对于volatile关键字的实现的问题，会导致&#8220;双重检查加锁&#8221;的失败，因此&#8220;双重检查加锁&#8221;机制只只能用在java5及以上的版本。<br /></strong></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><strong><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Singleton&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">volatile</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Singleton&nbsp;instance&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Singleton(){}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Singleton&nbsp;getInstance(){<br />&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">先检查实例是否存在，如果不存在才进入下面的同步块</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(instance&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">同步块，线程安全的创建实例</span><span style="color: #008000; "><br /></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">synchronized</span>&nbsp;(Singleton.<span style="color: #0000FF; ">class</span>)&nbsp;{<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">再次检查实例是否存在，如果不存在才真正的创建实例</span><span style="color: #008000; "><br /></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(instance&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; instance&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Singleton();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;instance;<br />&nbsp; &nbsp; }<br />}</strong></div><p>&nbsp;　　这种实现方式既可以实现线程安全地创建实例，而又不会对性能造成太大的影响。它只是第一次创建实例的时候同步，以后就不需要同步了，从而加快了运行速度。</p> <p>　　提示：由于volatile关键字可能会屏蔽掉虚拟机中一些必要的代码优化，所以运行效率并不是很高。因此一般建议，没有特别的需要，不要使用。也就是说，虽然可以使用&#8220;双重检查加锁&#8221;机制来实现线程安全的单例，但并不建议大量采用，可以根据情况来选用。</p> <p>　　根据上面的分析，常见的两种单例实现方式都存在小小的缺陷，那么有没有一种方案，既能实现延迟加载，又能实现线程安全呢？</p> <h3>4、Lazy initialization holder class模式</h3> <p>　　这个模式综合使用了Java的类级内部类和多线程缺省同步锁的知识，很巧妙地同时实现了延迟加载和线程安全。</p> <h3>　　1）.相应的基础知识</h3> <ul> <li>　什么是类级内部类？</li></ul>  <p><strong>　　简单点说，类级内部类指的是，有static修饰的成员式内部类。如果没有static修饰的成员式内部类被称为对象级内部类。</strong></p> <p><strong>　　类级内部类相当于其外部类的static成分，它的对象与外部类对象间不存在依赖关系，因此可直接创建。而对象级内部类的实例，是绑定在外部对象实例中的。</strong></p> <p><strong>　　类级内部类中，可以定义静态的方法。在静态方法中只能够引用外部类中的静态成员方法或者成员变量。</strong></p> <p><strong>　　类级内部类相当于其外部类的成员，只有在第一次被使用的时候才被会装载。</strong></p> <ul> <li>　多线程缺省同步锁的知识</li></ul>  <p><strong>　　大家都知道，在多线程开发中，为了解决并发问题，主要是通过使用synchronized来加互斥锁进行同步控制。但是在某些情况中，JVM已经隐含地为您执行了同步，这些情况下就不用自己再来进行同步控制了。这些情况包括：</strong></p> <p>　　1.由静态初始化器（在静态字段上或static{}块中的初始化器）初始化数据时</p> <p>　　2.访问final字段时</p> <p>　　3.在创建线程之前创建对象时</p> <p>　　4.线程可以看见它将要处理的对象时</p> <h3>　　2）.解决方案的思路</h3> <p>　　要想很简单地实现线程安全，可以采用静态初始化器的方式，它可以由JVM来保证线程的安全性。比如前面的饿汉式实现方式。但是这样一来，不是会浪费一定的空间吗？因为这种实现方式，会在类装载的时候就初始化对象，不管你需不需要。</p> <p>　　如果现在有一种方法能够让类装载的时候不去初始化对象，那不就解决问题了？一种可行的方式就是采用类级内部类，在这个类级内部类里面去创建对象实例。这样一来，只要不使用到这个类级内部类，那就不会创建对象实例，从而同时实现延迟加载和线程安全。</p> <p>　　示例代码如下：<br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><strong><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Singleton&nbsp;{<br /></strong><strong><span style="color: #0000FF; ">&nbsp; &nbsp; private</span>&nbsp;Singleton(){}</strong><strong><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;类级的内部类，也就是静态的成员式内部类，该内部类的实例与外部类的实例<br />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;没有绑定关系，而且只有被调用到时才会装载，从而实现了延迟加载。<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;SingletonHolder{<br />&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp; &nbsp; &nbsp; &nbsp; *&nbsp;静态初始化器，由JVM来保证线程安全<br />&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Singleton&nbsp;instance&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Singleton();<br />&nbsp; &nbsp; }<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Singleton&nbsp;getInstance(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;SingletonHolder.instance;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</strong></div><p>&nbsp;　　当getInstance方法第一次被调用的时候，它第一次读取SingletonHolder.instance，导致SingletonHolder类得到初始化；而这个类在装载并被初始化的时候，会初始化它的静态域，从而创建Singleton的实例，由于是静态的域，因此只会在虚拟机装载类的时候初始化一次，并由虚拟机来保证它的线程安全性。</p> <p>　　这个模式的优势在于，getInstance方法并没有被同步，并且只是执行一个域的访问，因此延迟初始化并没有增加任何访问成本。</p> <h3>5、单例和枚举（还没实际用过）</h3> <p>　　按照《高效Java 第二版》中的说法：单元素的枚举类型已经成为实现Singleton的最佳方法。用枚举来实现单例非常简单，只需要编写一个包含单个元素的枚举类型即可。<br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><strong><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">enum</span>&nbsp;Singleton&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;定义一个枚举的元素，它就代表了Singleton的一个实例。<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br /></strong><strong>&nbsp; &nbsp; uniqueInstance;</strong><strong><br /></strong><strong>&nbsp; &nbsp;&nbsp;<span style="color: #008000; ">/**</span></strong><strong><br /><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;单例可以有自己的操作<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;singletonOperation(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">功能处理</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</strong></div><p>&nbsp;　　使用枚举来实现单实例控制会更加简洁，而且无偿地提供了序列化机制，并由JVM从根本上提供保障，绝对防止多次实例化，是更简洁、高效、安全的实现单例的方式。<br /></p><hr /><p>&nbsp;</p><img src ="http://www.blogjava.net/chinan/aggbug/397213.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chinan/" target="_blank">何健超</a> 2013-04-01 09:38 <a href="http://www.blogjava.net/chinan/articles/397213.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>