﻿<?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/ltc603/category/14102.html</link><description>&lt;font size="3"&gt;学无止境&lt;/font&gt;
&lt;br&gt;

&lt;script type="text/javascript" src="http://wujunlove.googlepages.com/bigstaticeyes.js"&gt;&lt;/script&gt;</description><language>zh-cn</language><lastBuildDate>Thu, 01 Mar 2007 02:35:56 GMT</lastBuildDate><pubDate>Thu, 01 Mar 2007 02:35:56 GMT</pubDate><ttl>60</ttl><item><title>模式</title><link>http://www.blogjava.net/ltc603/archive/2006/08/29/66361.html</link><dc:creator>阿成</dc:creator><author>阿成</author><pubDate>Tue, 29 Aug 2006 01:56:00 GMT</pubDate><guid>http://www.blogjava.net/ltc603/archive/2006/08/29/66361.html</guid><wfw:comment>http://www.blogjava.net/ltc603/comments/66361.html</wfw:comment><comments>http://www.blogjava.net/ltc603/archive/2006/08/29/66361.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ltc603/comments/commentRss/66361.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ltc603/services/trackbacks/66361.html</trackback:ping><description><![CDATA[
		<div class="entrylistItem">
				<a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl00_TitleUrl" href="/renyangok/articles/61157.html">
						<strong>
								<font color="#6fbc4c" size="2">Interpreter（解释器）模式</font>
						</strong>
				</a>
				<br />
				<div class="postSeparator">
				</div>
				<a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl02_TitleUrl" href="/renyangok/articles/61141.html">
						<strong>
								<font color="#6fbc4c" size="2">
										<br />Memento（备望录）模式</font>
						</strong>
				</a>
		</div>
		<div class="entrylistItem">
				<div class="entrylistItemPostDesc"> </div>
		</div>
		<div class="postSeparator">
		</div>
		<div class="entrylistItem">
				<a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl04_TitleUrl" href="/renyangok/articles/61055.html">
						<strong>
								<font color="#6fbc4c" size="2">用composite模式写的一个二叉树的例子</font>
						</strong>
				</a>
				<div class="entrylistItemPostDesc"> </div>
		</div>
		<div class="postSeparator">
		</div>
		<div class="entrylistItem">
				<a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl06_TitleUrl" href="/renyangok/articles/61052.html">
						<strong>
								<font color="#6fbc4c" size="2">Composite（组合）模式</font>
						</strong>
				</a>
				<div class="entrylistItemPostDesc"> </div>
		</div>
		<div class="postSeparator">
		</div>
		<div class="entrylistItem">
				<a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl08_TitleUrl" href="/renyangok/articles/59996.html">
						<strong>
								<font color="#6fbc4c" size="2">Proxy（代理）模式</font>
						</strong>
				</a>
				<div class="entrylistItemPostDesc"> </div>
		</div>
		<div class="postSeparator">
		</div>
		<div class="entrylistItem">
				<a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl10_TitleUrl" href="/renyangok/articles/59949.html">
						<strong>
								<font color="#6fbc4c" size="2">模式间区别（不断更新）</font>
						</strong>
				</a>
				<div class="entrylistItemPostDesc"> </div>
		</div>
		<div class="postSeparator">
		</div>
		<div class="entrylistItem">
				<a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl12_TitleUrl" href="/renyangok/articles/59836.html">
						<strong>
								<font color="#6fbc4c" size="2">Prototype（原型）模式</font>
						</strong>
				</a>
				<div class="entrylistItemPostDesc"> </div>
		</div>
		<div class="postSeparator">
		</div>
		<div class="entrylistItem">
				<a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl14_TitleUrl" href="/renyangok/articles/59814.html">
						<strong>
								<font color="#6fbc4c" size="2">Builder（生成器）模式</font>
						</strong>
				</a>
				<div class="entrylistItemPostDesc"> </div>
		</div>
		<div class="postSeparator">
		</div>
		<div class="entrylistItem">
				<a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl16_TitleUrl" href="/renyangok/articles/59374.html">
						<strong>
								<font color="#6fbc4c" size="2">Template Method（模板方法）模式</font>
						</strong>
				</a>
				<div class="entrylistItemPostDesc"> </div>
		</div>
		<div class="postSeparator">
		</div>
		<div class="entrylistItem">
				<a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl18_TitleUrl" href="/renyangok/articles/59127.html">
						<strong>
								<font color="#6fbc4c" size="2">Observer（观察者）模式</font>
						</strong>
				</a>
				<div class="entrylistItemPostDesc"> </div>
		</div>
		<div class="postSeparator">
		</div>
		<div class="entrylistItem">
				<a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl20_TitleUrl" href="/renyangok/articles/59008.html">
						<strong>
								<font color="#6fbc4c" size="2">Decorator（装饰）模式</font>
						</strong>
				</a>
				<div class="entrylistItemPostDesc"> </div>
		</div>
		<div class="postSeparator">
		</div>
		<div class="entrylistItem">
				<a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl22_TitleUrl" href="/renyangok/articles/58975.html">
						<strong>
								<font color="#6fbc4c" size="2">Strategy（策略）模式</font>
						</strong>
				</a>
				<br />
		</div>
		<div class="postSeparator">
		</div>
		<div class="entrylistItem">
				<a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl24_TitleUrl" href="/renyangok/articles/58714.html">
						<strong>
								<font color="#6fbc4c" size="2">简单工厂，Factory Method（工厂方法）和Abstract Factory（抽象工厂）模式</font>
						</strong>
				</a>
				<div class="entrylistItemPostDesc"> </div>
		</div>
		<div class="postSeparator">
		</div>
		<div class="entrylistItem">
				<a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl26_TitleUrl" href="/renyangok/articles/58706.html">
						<strong>
								<font color="#6fbc4c" size="2">Singleton（单态）模式 和 Double-Checked Locking（双重检查锁定）模式</font>
						</strong>
				</a>
				<div class="entrylistItemPostDesc"> </div>
		</div>
		<div class="postSeparator">
		</div>
		<div class="entrylistItem">
				<a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl28_TitleUrl" href="/renyangok/articles/58695.html">
						<strong>
								<font color="#6fbc4c" size="2">设计模式的原则和策略</font>
						</strong>
				</a>
				<div class="entrylistItemPostDesc"> </div>
		</div>
		<div class="postSeparator">
		</div>
		<div class="entrylistItem">
				<a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl30_TitleUrl" href="/renyangok/articles/57591.html">
						<strong>
								<font color="#6fbc4c" size="2">Adapter（适配器）模式</font>
						</strong>
				</a>
				<br />
		</div>
		<div class="postSeparator">
		</div>
		<div class="entrylistItem">
				<a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl32_TitleUrl" href="/renyangok/articles/57541.html">
						<strong>
								<font color="#6fbc4c" size="2">Facade（外观）模式</font>
						</strong>
				</a>
				<div class="entrylistItemPostDesc"> </div>
		</div>
		<div class="postSeparator">
		</div>
		<div class="entrylistItem">
				<a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl34_TitleUrl" href="/renyangok/articles/57540.html">
						<strong>
								<font color="#6fbc4c" size="2">Bridge（桥接）模式</font>
						</strong>
				</a>
				<div class="entrylistItemPostDesc"> </div>
		</div>
<img src ="http://www.blogjava.net/ltc603/aggbug/66361.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ltc603/" target="_blank">阿成</a> 2006-08-29 09:56 <a href="http://www.blogjava.net/ltc603/archive/2006/08/29/66361.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Strategy（策略）模式</title><link>http://www.blogjava.net/ltc603/archive/2006/08/18/64253.html</link><dc:creator>阿成</dc:creator><author>阿成</author><pubDate>Fri, 18 Aug 2006 01:09:00 GMT</pubDate><guid>http://www.blogjava.net/ltc603/archive/2006/08/18/64253.html</guid><wfw:comment>http://www.blogjava.net/ltc603/comments/64253.html</wfw:comment><comments>http://www.blogjava.net/ltc603/archive/2006/08/18/64253.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ltc603/comments/commentRss/64253.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ltc603/services/trackbacks/64253.html</trackback:ping><description><![CDATA[
		<p>Strategy策略模式是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类.</p>
		<p>Stratrgy应用比较广泛,比如, 公司经营业务变化图, 可能有两种实现方式,一个是线条曲线,一个是框图(bar),这是两种算法,可以使用Strategy实现.</p>
		<p>这里以字符串替代为例, 有一个文件,我们需要读取后,希望替代其中相应的变量,然后输出.关于替代其中变量的方法可能有多种方法,这取决于用户的要求,所以我们要准备几套变量字符替代方案.</p>
		<p>
				<img src="http://www.jdon.com/designpatterns/images/Strategy.jpg" height="323" width="443" />
		</p>
		<p> </p>
		<p>首先,我们建立一个抽象类RepTempRule 定义一些公用变量和方法:</p>
		<table border="0" bordercolor="#cccccc" cellpadding="3" cellspacing="3" width="80%">
				<tbody>
						<tr>
								<td bgcolor="#cccccc">public abstract class RepTempRule{<br /><br />protected String oldString="";<br />public void setOldString(String oldString){<br />　　this.oldString=oldString; <br />}<br /><br />protected String newString="";<br />public String getNewString(){<br />　　return newString;<br />}<br /><br /><br /><br />public abstract void replace() throws Exception;<br /><br /><br />}</td>
						</tr>
				</tbody>
		</table>
		<p>在RepTempRule中 有一个抽象方法abstract需要继承明确,这个replace里其实是替代的具体方法.<br />我们现在有两个字符替代方案,<br />1.将文本中aaa替代成bbb;<br />2.将文本中aaa替代成ccc;<br /><br />对应的类分别是RepTempRuleOne RepTempRuleTwo</p>
		<table border="0" cellpadding="3" cellspacing="3" width="80%">
				<tbody>
						<tr>
								<td bgcolor="#cccccc">
										<p>public class RepTempRuleOne extends RepTempRule{<br /><br /><br />public void replace() throws Exception{ <br /><br />　　//replaceFirst是jdk1.4新特性 <br />　　newString=oldString.replaceFirst("aaa", "bbbb") <br />　　System.out.println("this is replace one");<br />　　 <br />}<br /><br /><br />}</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table border="0" cellpadding="3" cellspacing="3" width="80%">
				<tbody>
						<tr>
								<td bgcolor="#cccccc">public class RepTempRuleTwo extends RepTempRule{<br /><br /><br />public void replace() throws Exception{ <br /><br />　　newString=oldString.replaceFirst("aaa", "ccc") <br />　　System.out.println("this is replace Two");<br />　　 <br />}<br /><br /><br />}</td>
						</tr>
				</tbody>
		</table>
		<p>第二步：我们要建立一个算法解决类，用来提供客户端可以自由选择算法。</p>
		<table border="1" width="80%">
				<tbody>
						<tr>
								<td bgcolor="#cccccc">public class RepTempRuleSolve { 
<p>　　private RepTempRule strategy;</p><p>　　public RepTempRuleSolve(RepTempRule rule){<br />　　　　this.strategy=rule;<br />　　}</p><p>　　public String getNewContext(Site site,String oldString) {<br />　　　　return strategy.replace(site,oldString);<br />　　}</p><p>　　public void changeAlgorithm(RepTempRule newAlgorithm) {<br />　　　　strategy = newAlgorithm;<br />　　}</p><p>}</p></td>
						</tr>
				</tbody>
		</table>
		<p> </p>
		<p> </p>
		<p>调用如下:</p>
		<table border="0" cellpadding="3" cellspacing="3" width="100%">
				<tbody>
						<tr>
								<td bgcolor="#cccccc">
										<p>public class test{</p>
										<p>......</p>
										<p>　　public void testReplace(){</p>
										<p>　　//使用第一套替代方案<br />　　RepTempRuleSolve solver=new RepTempRuleSolve(new RepTempRuleSimple());<br />　　solver.getNewContext(site,context); </p>
										<p>　　//使用第二套</p>
										<p>　　solver=new RepTempRuleSolve(new RepTempRuleTwo());<br />　　solver.getNewContext(site,context); </p>
										<p>
										</p>
										<p>　　}</p>
										<p>.....</p>
										<p>}</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>我们达到了在运行期间，可以自由切换算法的目的。</p>
		<p>实际整个Strategy的核心部分就是抽象类的使用,使用Strategy模式可以在用户需要变化时,修改量很少,而且快速.</p>
		<p>Strategy和Factory有一定的类似,Strategy相对简单容易理解,并且可以在运行时刻自由切换。Factory重点是用来创建对象。</p>
		<p>Strategy适合下列场合:</p>
		<p>1.以不同的格式保存文件;</p>
		<p>2.以不同的算法压缩文件;</p>
		<p>3.以不同的算法截获图象;</p>
		<p>4.以不同的格式输出同样数据的图形,比如曲线 或框图bar等</p>
<img src ="http://www.blogjava.net/ltc603/aggbug/64253.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ltc603/" target="_blank">阿成</a> 2006-08-18 09:09 <a href="http://www.blogjava.net/ltc603/archive/2006/08/18/64253.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java设计模式 → 工厂模式</title><link>http://www.blogjava.net/ltc603/archive/2006/05/08/44942.html</link><dc:creator>阿成</dc:creator><author>阿成</author><pubDate>Mon, 08 May 2006 01:12:00 GMT</pubDate><guid>http://www.blogjava.net/ltc603/archive/2006/05/08/44942.html</guid><wfw:comment>http://www.blogjava.net/ltc603/comments/44942.html</wfw:comment><comments>http://www.blogjava.net/ltc603/archive/2006/05/08/44942.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ltc603/comments/commentRss/44942.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ltc603/services/trackbacks/44942.html</trackback:ping><description><![CDATA[
		<p>工厂模式定义:提供创建对象的接口.<br />为什么工厂模式是如此常用？因为工厂模式就相当于创建实例对象的new，<br />我们经常要根据类Class生成实例对象，如A a=new A() 工厂模式也是用来<br />创建实例对象的，所以以后new时就要多个心眼，是否可以考虑实用工厂模式，<br />虽然这样做，可能多做一些工作，但会给你系统带来更大的可扩展性和尽量少<br />的修改量。</p>
		<p>我们以类Sample为例， 如果我们要创建Sample的实例对象:<br /> Sample sample=new Sample();<br />可是，实际情况是，通常我们都要在创建sample实例时做点初始化的工作,比如<br />赋值 查询数据库等。首先，我们想到的是，可以使用Sample的构造函数，这样<br />生成实例就写成:  Sample sample=new Sample(参数);<br />但是，如果创建sample实例时所做的初始化工作不是象赋值这样简单的事，可能<br />是很长一段代码，如果也写入构造函数中，那你的代码很难看了（就需要Refactor重整）。<br />为什么说代码很难看，初学者可能没有这种感觉，我们分析如下，初始化工作如果<br />是很长一段代码，说明要做的工作很多，将很多工作装入一个方法中，相当于将很多鸡<br />蛋放在一个篮子里，是很危险的，这也是有背于Java面向对象的原则，面向对象的<br />封装(Encapsulation)和分派(Delegation)告诉我们，尽量将长的代码分派“切割”成<br />每段，将每段再“封装”起来(减少段和段之间偶合联系性)，这样，就会将风险分散，<br />以后如果需要修改，只要更改每段，不会再发生牵一动百的事情。<br />在本例中，首先，我们需要将创建实例的工作与使用实例的工作分开, 也就是说，<br />让创建实例所需要的大量初始化工作从Sample的构造函数中分离出去。<br />这时我们就需要Factory工厂模式来生成对象了，不能再用上面简单new Sample(参数)。<br />还有,如果Sample有个继承如MySample, 按照面向接口编程,我们需要将Sample抽象成一个<br />接口.现在Sample是接口,有两个子类MySample 和HisSample .我们要实例化他们时,如下:<br />Sample mysample=new MySample();<br />Sample hissample=new HisSample();<br />随着项目的深入,Sample可能还会"生出很多儿子出来", 那么我们要对这些儿子一个个<br />实例化,更糟糕的是,可能还要对以前的代码进行修改:加入后来生出儿子的实例.这在传<br />统程序中是无法避免的.<br />但如果你一开始就有意识使用了工厂模式,这些麻烦就没有了.<br />工厂方法<br />你会建立一个专门生产Sample实例的工厂:<br />public class Factory{<br />　　public static Sample creator(int which){<br />　　//getClass 产生Sample 一般可使用动态类装载装入类。<br />　　if (which==1)<br />　　　　return new SampleA();<br />　　else if (which==2)<br />　　　　return new SampleB();<br />　　}<br />}<br />那么在你的程序中,如果要实例化Sample时.就使用<br />Sample sampleA=Factory.creator(1);<br />这样,在整个就不涉及到Sample的具体子类,达到封装效果,也就减少错误修改的机会,<br />这个原理可以用很通俗的话来比喻:就是具体事情做得越多,越容易范错误.这每个做<br />过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,范错误可能性<br />就越少.好象我们从编程序中也能悟出人生道理?呵呵.<br />使用工厂方法要注意几个角色，首先你要定义产品接口，如上面的Sample,产品接口<br />下有Sample接口的实现类,如SampleA,其次要有一个factory类，用来生成产品Sample。<br />进一步稍微复杂一点，就是在工厂类上进行拓展，工厂类也有继承它的实现类<br />concreteFactory了。<br />抽象工厂<br />工厂模式中有: 工厂方法(Factory Method) 抽象工厂(Abstract Factory).<br />这两个模式区别在于需要创建对象的复杂程度上。如果我们创建对象的方法变得复杂了,<br />如上面工厂方法中是创建一个对象Sample,如果我们还有新的产品接口Sample2.<br />这里假设：Sample有两个concrete类SampleA和SamleB，而Sample2也有两个concrete类<br />Sample2A和SampleB2，那么，我们就将上例中Factory变成抽象类,将共同部分封装在抽<br />象类中,不同部分使用子类实现，下面就是将上例中的Factory拓展成抽象工厂:<br />public abstract class Factory{<br />　　public abstract Sample creator();<br />　　public abstract Sample2 creator(String name); <br />}<br />public class SimpleFactory extends Factory{<br />　　public Sample creator(){<br />　　　　.........<br />　　　　return new SampleA<br />　　}<br />　　public Sample2 creator(String name){<br />　　　　.........<br />　　　　return new Sample2A<br />　　}<br />}<br />public class BombFactory extends Factory{<br />　　public Sample creator(){<br />　　　　......<br />　　　　return new SampleB <br />　　}<br />　　public Sample2 creator(String name){<br />　　　　......<br />　　　　return new Sample2B<br />　　}<br />}<br />从上面看到两个工厂各自生产出一套Sample和Sample2,也许你会疑问，为什么我<br />不可以使用两个工厂方法来分别生产Sample和Sample2?<br />抽象工厂还有另外一个关键要点，是因为 SimpleFactory内，生产Sample和生产<br />Sample2的方法之间有一定联系，所以才要将这两个方法捆绑在一个类中，这个工厂<br />类有其本身特征，也许制造过程是统一的，比如：制造工艺比较简单，所以名称<br />叫SimpleFactory。<br />在实际应用中，工厂方法用得比较多一些，而且是和动态类装入器组合在一起应用，<br />举例<br />我们以Jive的ForumFactory为例，这个例子在前面的Singleton模式中我们讨论过，<br />现在再讨论其工厂模式:<br />public abstract class ForumFactory {<br />　　private static Object initLock = new Object();<br />　　private static String className = "com.jivesoftware.forum.database.DbForumFactory";<br />　　private static ForumFactory factory = null; <br />　　public static ForumFactory getInstance(Authorization authorization) {<br />　　　　//If no valid authorization passed in, return null.<br />　　　　if (authorization == null) {<br />　　　　　　return null;<br />　　　　}<br />　　　　//以下使用了Singleton 单态模式<br />　　　　if (factory == null) {<br />　　　　　　synchronized(initLock) {<br />　　　　　　　　if (factory == null) {<br />　　　　　　　　　　　　...... <br />　　　　　　　　　　try {<br />　　　　　　　　　　　　　　//动态转载类<br />　　　　　　　　　　　　　　Class c = Class.forName(className);<br />　　　　　　　　　　　　　　factory = (ForumFactory)c.newInstance();<br />　　　　　　　　　　}<br />　　　　　　　　　　catch (Exception e) {<br />　　　　　　　　　　　　　　return null;<br />　　　　　　　　　　}<br />　　　　　　　　}<br />　　　　　　}<br />　　　　}</p>
		<p>　　　　//Now, 返回 proxy.用来限制授权对forum的访问<br />　　　　return new ForumFactoryProxy(authorization, factory,<br />　　　　　　　　　　　　　　　　　　　　factory.getPermissions(authorization));<br />　　}</p>
		<p>　　//真正创建forum的方法由继承forumfactory的子类去完成.<br />　　public abstract Forum createForum(String name, String description)<br />　　throws UnauthorizedException, ForumAlreadyExistsException;</p>
		<p>　　....</p>
		<p>}<br />因为现在的Jive是通过数据库系统存放论坛帖子等内容数据,如果希望更改为通过文件系统实现,这个工厂方法ForumFactory就提供了提供动态接口:</p>
		<p>private static String className = "com.jivesoftware.forum.database.DbForumFactory";</p>
		<p>你可以使用自己开发的创建forum的方法代替com.jivesoftware.forum.database.DbForumFactory就可以.</p>
		<p>在上面的一段代码中一共用了三种模式,除了工厂模式外,还有Singleton单态模式,以及proxy模式,proxy模式主要用来授权用户对forum的访问,因为访问forum有两种人:一个是注册用户 一个是游客guest,那么那么相应的权限就不一样,而且这个权限是贯穿整个系统的,因此建立一个proxy,类似网关的概念,可以很好的达到这个效果.  </p>
		<p>看看Java宠物店中的CatalogDAOFactory:</p>
		<p>public class CatalogDAOFactory { </p>
		<p>　　/**</p>
		<p>　　* 本方法制定一个特别的子类来实现DAO模式。<br />　　* 具体子类定义是在J2EE的部署描述器中。<br />　　*/</p>
		<p>　　public static CatalogDAO getDAO() throws CatalogDAOSysException {</p>
		<p>　　　　CatalogDAO catDao = null;</p>
		<p>　　　　try {</p>
		<p>　　　　　　InitialContext ic = new InitialContext();<br />　　　　　　//动态装入CATALOG_DAO_CLASS<br />　　　　　　//可以定义自己的CATALOG_DAO_CLASS，从而在无需变更太多代码<br />　　　　　　//的前提下，完成系统的巨大变更。</p>
		<p>　　　　　　String className =(String) ic.lookup(JNDINames.CATALOG_DAO_CLASS);</p>
		<p>　　　　　　catDao = (CatalogDAO) Class.forName(className).newInstance();</p>
		<p>　　　　} catch (NamingException ne) {</p>
		<p>　　　　　　throw new CatalogDAOSysException("<br />　　　　　　　　CatalogDAOFactory.getDAO: NamingException while <br />　　　　　　　　　　getting DAO type : \n" + ne.getMessage());</p>
		<p>　　　　} catch (Exception se) {</p>
		<p>　　　　　　throw new CatalogDAOSysException("<br />　　　　　　　　CatalogDAOFactory.getDAO: Exception while getting <br />　　　　　　　　　　DAO type : \n" + se.getMessage());</p>
		<p>　　　　}</p>
		<p>　　　　return catDao;</p>
		<p>　　}</p>
		<p>}</p>
		<p>CatalogDAOFactory是典型的工厂方法，catDao是通过动态类装入器className获得CatalogDAOFactory具体实现子类，这个实现子类在Java宠物店是用来操作catalog数据库，用户可以根据数据库的类型不同，定制自己的具体实现子类，将自己的子类名给与CATALOG_DAO_CLASS变量就可以。</p>
		<p>由此可见，工厂方法确实为系统结构提供了非常灵活强大的动态扩展机制，只要我们更换一下具体的工厂方法，系统其他地方无需一点变换，就有可能将系统功能进行改头换面的变化。</p>
		<p>设计模式如何在具体项目中应用见《Java实用系统开发指南》</p>
<img src ="http://www.blogjava.net/ltc603/aggbug/44942.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ltc603/" target="_blank">阿成</a> 2006-05-08 09:12 <a href="http://www.blogjava.net/ltc603/archive/2006/05/08/44942.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>