﻿<?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-我的Blog我做主^_^-文章分类-设计模式</title><link>http://www.blogjava.net/wyz191/category/19355.html</link><description>走向一条通往JAVA的不归路...</description><language>zh-cn</language><lastBuildDate>Wed, 14 May 2008 12:12:22 GMT</lastBuildDate><pubDate>Wed, 14 May 2008 12:12:22 GMT</pubDate><ttl>60</ttl><item><title>Template Method模板方法模式 </title><link>http://www.blogjava.net/wyz191/articles/template_method.html</link><dc:creator>java_蝈蝈</dc:creator><author>java_蝈蝈</author><pubDate>Thu, 08 May 2008 09:39:00 GMT</pubDate><guid>http://www.blogjava.net/wyz191/articles/template_method.html</guid><wfw:comment>http://www.blogjava.net/wyz191/comments/199294.html</wfw:comment><comments>http://www.blogjava.net/wyz191/articles/template_method.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyz191/comments/commentRss/199294.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyz191/services/trackbacks/199294.html</trackback:ping><description><![CDATA[行为模式：<br />
<br />
行为型模式涉及到算法和对象间职责的分配。将注意力从控制流转移到对象间的联系方式上来。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 行为模式分为：<span style="font-weight: bold; color: red">行为类模式</span>和<span style="font-weight: bold; color: red">行为对象模式</span>。<span style="font-weight: bold">行为类模式使用<span style="color: brown">继承机制</span>在类间分派行为</span>；<span style="font-weight: bold">行为对象模式使用<span style="color: limegreen">对象复合</span>而不是继承。</span><br />
<br />
Template Method模板方法模式<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Template Method模板方法模式介绍：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Template Method模板方法模式是一种行为型模式，具体点说是<span style="font-weight: bold">行为类型模式</span>。主要解决在软件构建过程中，对于某一项任务，常常有稳定的整体操作结构，但各个子步骤却有很多改变的需求，或者由于固有的原因而无法和任务的整体结构同时实现。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GoF《设计模式》中说道：定义一个操作中的算法的骨架，而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Template Method模式的结构<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义场景<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 单看结构不好理解，我们来结合程序进行分析。现在定义一个场景：我想大家都玩过极品飞车（我相当喜欢）。游戏中有很多的汽车，但是从操作角度看大同小异。无非是起步（StartUp）、行驶（Run）、停车（Stop）等等行为。汽车行驶的动作之间可能存在着差异，例如：手动档和自动档，但是接口是一样的，换句话说，基本都是这几个动作。结合Template Method模式讲就是在这个程序中，结构（对汽车的操作）是稳定的，但是变化在于各个子步骤（操作行为的具体实现）。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 程序实现与结构分析<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先我们需要一个汽车的抽象类（结构图中的AbstractClass）<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public abstract class AbstractCar<br />
<br />
&nbsp;&nbsp;&nbsp; {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected abstract string StartUp();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected abstract string Run();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected abstract string Stop();<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void DriveOnTheRoad()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(StartUp());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Run());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(Stop());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
}<br />
<br />
在这段代码中，抽象方法StartUp、Run、Stop叫做primitive operation（原语操作），它们是在子类中的扩展点，例如我们要编写一辆BORA的实现，在他继承AbstractCar后，可以在这几个primitive operation上进行自己个步骤的实现。<br />
<br />
<span style="font-weight: bold; color: red">AbstractCar中的DriveOnTheRoad方法叫做template method（模板方法）</span>，template method用primitive operation定义一个算法，<span style="font-weight: bold; color: green">是相对稳定的部分</span>。（子类中重新定义primitive operation）。<br />
<br />
&nbsp;&nbsp;&nbsp; 然后我们要实现一辆BORA汽车（结构图中的ConcreteClass）<br />
<br />
&nbsp;&nbsp;&nbsp; public class BORA : <span style="font-weight: bold">AbstractCar //继承</span><br />
<br />
&nbsp;&nbsp;&nbsp; {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected override string StartUp()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "BORA is StartUp";<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected override string Run()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "BORA is Running";<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected override string Stop()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "BORA is Stoped";<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
}<br />
<br />
接下来我们进行客户程序的实现<br />
<br />
class Program<br />
<br />
&nbsp;&nbsp;&nbsp; {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void Main(string[] args)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClientApp.Drive(new BORA());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.Read();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
}<br />
<br />
public class ClientApp<br />
<br />
&nbsp;&nbsp;&nbsp; {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void Drive(AbstractCar car)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; car.DriveOnTheRoad();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
}<br />
<br />
运行结果如下：<br />
<br />
BORA is StartUp<br />
<br />
BORA is Running<br />
<br />
BORA is Stoped<br />
<br />
&nbsp; &nbsp;<br />
<br />
Template Method要点<br />
<br />
1、&nbsp; Template Method模式是一种非常基础性的设计模式，在面向对象系统中有着大量的应用。它用最简洁的机制（<span style="font-weight: bold; color: red">虚函数的多态性</span>）为了很多应用程序框架提供了灵活的扩展点，是代码复用方面的基本实现结构。<br />
<br />
2、&nbsp; 除了可以灵活应对子步骤的变化外，&#8220;Don't call me.Let me Call you&#8221;的反向控制结构是Template Method的典型应用。&#8220;Don&#8217;t call me.Let me Call you&#8221;是指一个父类调用一个子类的操作，而不是相反。<br />
<br />
3、&nbsp; 在具体实现方面，被Template Method调用的虚方法可以具有实现，也可以没有任何实现（抽象方法、纯虚方法），但一般推荐将它们设置为protected方法。可以没有具体实现的方法应该称为hook operation（钩子操作），提供了缺省的行为，子类可以在必要时进行扩展。<br />
<br />
4、&nbsp; 尽量减少primitive operation，因为需要重新定义的操作越多，客户程序就越长 
<img src ="http://www.blogjava.net/wyz191/aggbug/199294.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyz191/" target="_blank">java_蝈蝈</a> 2008-05-08 17:39 <a href="http://www.blogjava.net/wyz191/articles/template_method.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Singleton  模式</title><link>http://www.blogjava.net/wyz191/articles/Singleton.html</link><dc:creator>java_蝈蝈</dc:creator><author>java_蝈蝈</author><pubDate>Fri, 19 Jan 2007 06:36:00 GMT</pubDate><guid>http://www.blogjava.net/wyz191/articles/Singleton.html</guid><wfw:comment>http://www.blogjava.net/wyz191/comments/94932.html</wfw:comment><comments>http://www.blogjava.net/wyz191/articles/Singleton.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyz191/comments/commentRss/94932.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyz191/services/trackbacks/94932.html</trackback:ping><description><![CDATA[
		<font size="2">Singleton-------唯一：<br />        以前是商标满天飞，相同的商标难免造成侵权，直从有商标保护法后，就保证了不会再产生第家企业使用相同的商标；</font>
		<br />
		<p class="MsoNormal" style="TEXT-INDENT: 0.5in">
				<font size="2">
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun">说到</span>Singleton,<span lang="ZH-CN" style="FONT-FAMILY: SimSun">就不能不提全局变量。过去我们反对全局变量，为什么呢？全局变量一般存在三个问题：</span></font>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 1in; TEXT-INDENT: -0.25in">
				<font size="2">&lt;!--[if !supportLists]--&gt;<span><span>1.<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">      </span></span></span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">命名冲突，也叫名字污染</span>&lt;!--[endif]--&gt;</font>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 1in; TEXT-INDENT: -0.25in">
				<font size="2">&lt;!--[if !supportLists]--&gt;<span><span>2.<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">      </span></span></span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">初始化顺序依赖问题。</span>&lt;!--[endif]--&gt;</font>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 1in; TEXT-INDENT: -0.25in">
				<font size="2">&lt;!--[if !supportLists]--&gt;<span><span>3.<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">      </span></span></span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">远程代码耦合问题。</span>&lt;!--[endif]--&gt;</font>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 0.5in">
				<font size="2">
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun">对于第一个问题，其实解决很简单，通过命名规范可以有效解决。另外，借助语言机制也容易解决，例如</span>C++<span lang="ZH-CN" style="FONT-FAMILY: SimSun">的</span>namespace, class<span lang="ZH-CN" style="FONT-FAMILY: SimSun">或</span>struct<span lang="ZH-CN" style="FONT-FAMILY: SimSun">的静态数据成员。</span>Java<span lang="ZH-CN" style="FONT-FAMILY: SimSun">和</span>C#<span lang="ZH-CN" style="FONT-FAMILY: SimSun">根本不允许全局变量，并且引入包机制，都可以缓解甚至消除这一影响，至少，</span>Singleton<span lang="ZH-CN" style="FONT-FAMILY: SimSun">对该问题的解决力度并不超过这些语言提供的内建机制。</span></font>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 0.5in">
				<font size="2">
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun">初始化顺序依赖问题是一个相当微妙的问题。借助于</span>Singleton, <span lang="ZH-CN" style="FONT-FAMILY: SimSun">我们可以强制某些对象按需创建，避免初始化顺序依赖导致的问题。然而，初始化顺序是一个雷区，我们必须小心翼翼地绕过去，但首先不应该通过实现技术来规避问题，而应该调整设计，让初始化顺序问题根本不出现才是上策。第二，某些情况下，我们确实需要规避初始化顺序问题，我们也需要清醒地认识到该实现手段影响到的代码范围，受其影响的部分越单一越好。</span></font>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 0.5in">
				<font size="2">
						<span lang="ZH-CN" style="FONT-FAMILY: SimSun">远程代码耦合，这是我们反对全局变量的核心问题。任何长距离的耦合都将导致代码的可读性下降，进而可能影响代码结构，导致结构僵化，无力应对因需求变化导致的结构调整。很遗憾，</span>Singleton<span lang="ZH-CN" style="FONT-FAMILY: SimSun">并不能对这个问题有任何帮助。当我们回避全局变量的时候，事实上，我们也规避了上述的三个问题。可是，如果我们不能审慎地使用</span>Singleton<span lang="ZH-CN" style="FONT-FAMILY: SimSun">就会重新落入全局变量的核心陷阱中去。</span></font>
				<br />
				<br />
		</p>
		<table cellspacing="1" cellpadding="10" width="94%" align="center">
				<tbody>
						<tr>
								<td>
										<font color="#000000" size="2">名称</font>
								</td>
								<td>
										<b>
												<font color="#000000" size="2">Singleton</font>
										</b>
								</td>
						</tr>
						<tr>
								<td>
										<font color="#000000" size="2">结构</font>
								</td>
								<td>
										<font color="#000000" size="2">
												<img title="Singleton" src="mk:@MSITStore:E:\王振\E\学习\书籍\设计模式.chm::/110_files/Singleton[1].gif" />
										</font>
								</td>
						</tr>
						<tr>
								<td>
										<font color="#000000" size="2">意图</font>
								</td>
								<td>
										<font color="#000000" size="2">保证一个类仅有一个实例，并提供一个访问它的全局访问点。</font>
								</td>
						</tr>
						<tr>
								<td>
										<font color="#000000" size="2">适用性</font>
								</td>
								<td>
										<ul>
												<li>
														<font color="#000000" size="2">当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。 </font>
												</li>
												<li>
														<font color="#000000" size="2">当这个唯一实例应该是通过子类化可扩展的，并且客户应该无需更改代码就能使用一个扩展的实例时。 </font>
												</li>
										</ul>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />Singleton模式主要作用是保证在Java应用程序中，一个类Class只有一个实例存在。 <p>在很多操作中，比如建立目录 数据库连接都需要这样的单线程操作。</p><p>还有, singleton能够被状态化; 这样，多个单态类在一起就可以作为一个状态仓库一样向外提供服务，比如，你要论坛中的帖子计数器，每次浏览一次需要计数，单态类能否保持住这个计数，并且能synchronize的安全自动加1，如果你要把这个数字永久保存到数据库，你可以在不修改单态接口的情况下方便的做到。</p><p>另外方面，Singleton也能够被无状态化。提供工具性质的功能，<br /><br />Singleton模式就为我们提供了这样实现的可能。使用Singleton的好处还在于可以节省内存，因为它限制了实例的个数，有利于Java垃圾回收（garbage collection）。<br /><br />我们常常看到工厂模式中类装入器(class loader)中也用Singleton模式实现的,因为被装入的类实际也属于资源。<br /></p><p><strong>如何使用?</strong><br />一般Singleton模式通常有几种形式:</p><table cellspacing="3" cellpadding="3" width="100%" border="0"><tbody><tr><td><p>public class Singleton {</p><p>　　private Singleton(){}</p><p>　　//在自己内部定义自己一个实例，是不是很奇怪？<br />　　//注意这是private 只供内部调用</p><p>　　private static Singleton instance = new Singleton();</p><p>　　//这里提供了一个供外部访问本class的静态方法，可以直接访问　　<br />　　public static Singleton getInstance() {<br />　　　　return instance; 　　<br />　　 } <br />} </p><p> </p></td></tr></tbody></table><p>第二种形式:</p><table cellspacing="3" cellpadding="3" width="100%" border="0"><tbody><tr><td>public class Singleton { 
<p>　　private static Singleton instance = null;<br /><br />　　public static synchronized Singleton getInstance() {<br /><br />　　//这个方法比上面有所改进，不用每次都进行生成对象，只是第一次　　　 　<br />　　//使用时生成实例，提高了效率！<br />　　if (instance==null)<br />　　　　instance＝new Singleton();<br />　　return instance; 　　} </p><p>} </p><p> </p></td></tr></tbody></table><p>使用Singleton.getInstance()可以访问单态类。</p><p>上面第二中形式是lazy initialization，也就是说第一次调用时初始Singleton，以后就不用再生成了。</p><p>注意到lazy initialization形式中的synchronized，这个synchronized很重要，如果没有synchronized，那么使用getInstance()是有可能得到多个Singleton实例。关于lazy initialization的Singleton有很多涉及double-checked locking (DCL)的讨论，有兴趣者进一步研究。</p><p>一般认为第一种形式要更加安全些。<br /></p><img src ="http://www.blogjava.net/wyz191/aggbug/94932.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyz191/" target="_blank">java_蝈蝈</a> 2007-01-19 14:36 <a href="http://www.blogjava.net/wyz191/articles/Singleton.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>