﻿<?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-OpenStudio Weblog-随笔分类-设计模式</title><link>http://www.blogjava.net/zpuser/category/18669.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 08 Mar 2007 02:27:01 GMT</lastBuildDate><pubDate>Thu, 08 Mar 2007 02:27:01 GMT</pubDate><ttl>60</ttl><item><title>工厂方法模式Factory Method</title><link>http://www.blogjava.net/zpuser/archive/2007/02/28/101042.html</link><dc:creator>阿卜</dc:creator><author>阿卜</author><pubDate>Tue, 27 Feb 2007 16:51:00 GMT</pubDate><guid>http://www.blogjava.net/zpuser/archive/2007/02/28/101042.html</guid><wfw:comment>http://www.blogjava.net/zpuser/comments/101042.html</wfw:comment><comments>http://www.blogjava.net/zpuser/archive/2007/02/28/101042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zpuser/comments/commentRss/101042.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zpuser/services/trackbacks/101042.html</trackback:ping><description><![CDATA[
		<div>
				<br />
				<p class="MsoToc2" style="MARGIN: 0cm 0cm 0pt 21pt; tab-stops: 42.0pt right dotted 414.8pt">
						<span lang="EN-US">
								<span class="MsoHyperlink">
										<span style="mso-no-proof: yes">
												<a href="#_Toc160741679">1.<span style="COLOR: windowtext; TEXT-DECORATION: none; text-underline: none"><span style="mso-tab-count: 1">    </span></span><span lang="EN-US" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span lang="EN-US">模式定义</span></span><span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"><span style="mso-tab-count: 1 dotted">... </span></span><span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen">1</span><span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"></span></a>
										</span>
								</span>
								<span style="mso-no-proof: yes">
										<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
										<o:p>
										</o:p>
								</span>
						</span>
				</p>
				<p class="MsoToc2" style="MARGIN: 0cm 0cm 0pt 21pt; tab-stops: 42.0pt right dotted 414.8pt">
						<span class="MsoHyperlink">
								<span lang="EN-US" style="mso-no-proof: yes">
										<a href="#_Toc160741680">2.<span style="COLOR: windowtext; TEXT-DECORATION: none; text-underline: none"><span style="mso-tab-count: 1">    </span></span><span lang="EN-US" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span lang="EN-US">模式介绍</span></span><span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"><span style="mso-tab-count: 1 dotted">... </span></span><span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen">1</span><span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"></span></a>
								</span>
						</span>
						<span lang="EN-US" style="mso-no-proof: yes">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="MsoToc2" style="MARGIN: 0cm 0cm 0pt 21pt; tab-stops: 42.0pt right dotted 414.8pt">
						<span class="MsoHyperlink">
								<span lang="EN-US" style="mso-no-proof: yes">
										<a href="#_Toc160741681">3.<span style="COLOR: windowtext; TEXT-DECORATION: none; text-underline: none"><span style="mso-tab-count: 1">    </span></span><span lang="EN-US" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span lang="EN-US">模式特点</span></span><span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"><span style="mso-tab-count: 1 dotted">... </span></span><span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen">2</span><span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"></span></a>
								</span>
						</span>
						<span lang="EN-US" style="mso-no-proof: yes">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="MsoToc2" style="MARGIN: 0cm 0cm 0pt 21pt; tab-stops: 42.0pt right dotted 414.8pt">
						<span class="MsoHyperlink">
								<span lang="EN-US" style="mso-no-proof: yes">
										<a href="#_Toc160741682">4.<span style="COLOR: windowtext; TEXT-DECORATION: none; text-underline: none"><span style="mso-tab-count: 1">    </span></span><span lang="EN-US" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span lang="EN-US">与其它模式的关系</span></span><span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"><span style="mso-tab-count: 1 dotted">... </span></span><span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen">3</span><span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"></span></a>
								</span>
						</span>
						<span lang="EN-US" style="mso-no-proof: yes">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="MsoToc2" style="MARGIN: 0cm 0cm 0pt 21pt; tab-stops: 42.0pt right dotted 414.8pt">
						<span class="MsoHyperlink">
								<span lang="EN-US" style="mso-no-proof: yes">
										<a href="#_Toc160741683">5.<span style="COLOR: windowtext; TEXT-DECORATION: none; text-underline: none"><span style="mso-tab-count: 1">    </span></span><span lang="EN-US" style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span lang="EN-US">参考</span></span><span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"><span style="mso-tab-count: 1 dotted">... </span></span><span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen">3</span><span style="DISPLAY: none; COLOR: windowtext; TEXT-DECORATION: none; text-underline: none; mso-hide: screen"></span></a>
								</span>
						</span>
						<span lang="EN-US" style="mso-no-proof: yes">
								<o:p>
								</o:p>
						</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<o:p> </o:p>
						</span>
				</p>
				<h2 style="MARGIN: 13pt 0cm 13pt 18pt; TEXT-INDENT: -18pt; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
						<a name="_Toc160741679">
								<span lang="EN-US" style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial">
										<span style="mso-list: Ignore">
												<font face="Arial">1.</font>
												<span style="FONT: 7pt 'Times New Roman'">   </span>
										</span>
								</span>
								<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">模式定义</span>
						</a>
				</h2>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工厂方法模式</span>
						<span lang="EN-US">(Factory Method)</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是创建模式的一种，也叫虚拟构造子</span>
						<span lang="EN-US">(Virture Constractor)</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式或多态性工厂</span>
						<span lang="EN-US">(Polymorphic Factory)</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式。</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-tab-count: 1">       </span>
						</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工厂方法模式定义一个抽象的对象创建类或接口，将实际的对象创建工作交给子类来实现。</span>
				</p>
				<h2 style="MARGIN: 13pt 0cm 13pt 18pt; TEXT-INDENT: -18pt; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
						<a name="_Toc160741680">
								<span lang="EN-US" style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial">
										<span style="mso-list: Ignore">
												<font face="Arial">2.</font>
												<span style="FONT: 7pt 'Times New Roman'">   </span>
										</span>
								</span>
								<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">模式介绍</span>
						</a>
				</h2>
				<h3 style="MARGIN: 13pt 0cm 13pt 24pt; TEXT-INDENT: -24pt; tab-stops: list 24.0pt; mso-list: l0 level2 lfo1">
						<font size="5">
								<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
										<span style="mso-list: Ignore">2.1.</span>
								</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">简单类图</span>
						</font>
				</h3>
				<h3 style="MARGIN: 13pt 0cm 13pt 24pt; TEXT-INDENT: -24pt; tab-stops: list 24.0pt; mso-list: l0 level2 lfo1">
						<font size="5">
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
										<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">
												<font size="3">
														<font face="宋体, MS Song"> <?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /?><v:stroke joinstyle="miter"></v:stroke><v:path gradientshapeok="t" o:connecttype="rect"></v:path></font>
												</font>
												<v:shape id="_x0000_s1042" style="MARGIN-TOP: 246.2pt; Z-INDEX: 1; LEFT: 0px; MARGIN-LEFT: 136.9pt; WIDTH: 90pt; POSITION: absolute; HEIGHT: 23.4pt; TEXT-ALIGN: left" type="#_x0000_t202">
												</v:shape>
												<img src="http://zhangpu.17disk.com/downloadServlet?fileId=15761&amp;preview=true" />
										</span>
								</span>
						</font>
				</h3>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
						</span>
				</p>
				<h3 style="MARGIN: 13pt 0cm 13pt 24pt; TEXT-INDENT: -24pt; tab-stops: list 24.0pt; mso-list: l0 level2 lfo1">
						<font size="5">
								<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
										<span style="mso-list: Ignore">2.2.</span>
								</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类图对应示例代码</span>
						</font>
				</h3>
				<h4 style="MARGIN: 14pt 0cm 14.5pt 36pt; TEXT-INDENT: -36pt; tab-stops: list 36.0pt; mso-list: l0 level3 lfo1">
						<font size="5">
								<span lang="EN-US" style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial">
										<span style="mso-list: Ignore">
												<font face="Arial">2.2.1.</font>
										</span>
								</span>
								<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">抽象产品：</span>
								<span lang="EN-US">
										<font face="Arial">AbstractProduct</font>
								</span>
						</font>
				</h4>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">public interface AbstractProduct{</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-spacerun: yes">  </span>public void printName();</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">}</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<o:p> </o:p>
						</span>
				</p>
				<h4 style="MARGIN: 14pt 0cm 14.5pt 36pt; TEXT-INDENT: -36pt; tab-stops: list 36.0pt; mso-list: l0 level3 lfo1">
						<font size="5">
								<span lang="EN-US" style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial">
										<span style="mso-list: Ignore">
												<font face="Arial">2.2.2.</font>
										</span>
								</span>
								<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">具体产品：</span>
								<span lang="EN-US">
										<font face="Arial">ConcreteProduct1</font>
								</span>
								<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">和</span>
								<span lang="EN-US">
										<font face="Arial">ConcreteProduct2</font>
								</span>
						</font>
				</h4>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">public class ConcreteProduct1 implements AbstractProduct{</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-spacerun: yes">  </span>public void printName(){</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-spacerun: yes">    </span>System.out.println(“ConcreteProduct<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /?><st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1" unitname="”" w:st="on">1”</st1:chmetcnv>);</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 10.5pt; mso-char-indent-count: 1.0">
						<span lang="EN-US">}</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">}</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">public class ConcreteProduct2 implements AbstractProduct{</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-spacerun: yes">  </span>public void printName(){</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-spacerun: yes">    </span>System.out.println(“ConcreteProduct<st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="2" unitname="”" w:st="on">2”</st1:chmetcnv>);</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 10.5pt; mso-char-indent-count: 1.0">
						<span lang="EN-US">}</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">}</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<o:p> </o:p>
						</span>
				</p>
				<h4 style="MARGIN: 14pt 0cm 14.5pt 36pt; TEXT-INDENT: -36pt; tab-stops: list 36.0pt; mso-list: l0 level3 lfo1">
						<font size="5">
								<span lang="EN-US" style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial">
										<span style="mso-list: Ignore">
												<font face="Arial">2.2.3.</font>
										</span>
								</span>
								<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">抽象工厂：</span>
								<span lang="EN-US">
										<font face="Arial">AbstractFactory</font>
								</span>
						</font>
				</h4>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">public interface AbstractFactory {</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-spacerun: yes">  </span>public AbstractProduct factoryMethod();</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">}</span>
				</p>
				<h4 style="MARGIN: 14pt 0cm 14.5pt 36pt; TEXT-INDENT: -36pt; tab-stops: list 36.0pt; mso-list: l0 level3 lfo1">
						<font size="5">
								<span lang="EN-US" style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial">
										<span style="mso-list: Ignore">
												<font face="Arial">2.2.4.</font>
										</span>
								</span>
								<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">具体工厂：</span>
								<span lang="EN-US">
										<font face="Arial">ConcreteFactory1</font>
								</span>
								<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">和</span>
								<span lang="EN-US">
										<font face="Arial">ConcreteFactory2</font>
								</span>
						</font>
				</h4>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">public class ConcreteFactory1 implements AbstractFactory{</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-spacerun: yes">  </span>public AbstractProduct factoryMethod(){</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
						<span lang="EN-US">//do something.</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
						<span lang="EN-US">return new ConcreteProduct1();</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 10.5pt; mso-char-indent-count: 1.0">
						<span lang="EN-US">}</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">}</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<o:p> </o:p>
						</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">public class ConcreteFactory2 implements AbstractFactory{</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-spacerun: yes">  </span>public AbstractProduct factoryMethod(){</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
						<span lang="EN-US">//do something.</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
						<span lang="EN-US">return new ConcreteProduct2();</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 10.5pt; mso-char-indent-count: 1.0">
						<span lang="EN-US">}</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">}</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<o:p> </o:p>
						</span>
				</p>
				<h2 style="MARGIN: 13pt 0cm 13pt 18pt; TEXT-INDENT: -18pt; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
						<a name="_Toc160741681">
								<span lang="EN-US" style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial">
										<span style="mso-list: Ignore">
												<font face="Arial">3.</font>
												<span style="FONT: 7pt 'Times New Roman'">   </span>
										</span>
								</span>
								<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">模式特点</span>
						</a>
				</h2>
				<h3 style="MARGIN: 13pt 0cm 13pt 24pt; TEXT-INDENT: -24pt; tab-stops: list 24.0pt; mso-list: l0 level2 lfo1">
						<font size="5">
								<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
										<span style="mso-list: Ignore">3.1.</span>
								</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开闭原则（优点）</span>
						</font>
				</h3>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工厂方法模式解决了简单工厂模式的一些缺陷，是在简单工厂模式的基础上发展的。</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">简单工厂模式把所有的重心放到工厂类上，一旦向系统增加新的产品，就必须修改工厂类，不满足开闭原则；工厂方法模式提供一个抽象的工厂接口，在不同的产品结构上实现不同的产品工厂具体类来创建该层次中的产品，通常一个具体工厂创建一个具体产品。在新增产品的时候，只需要实现新的对应工厂就可以满足需要，是符合开闭原则的。</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<o:p> </o:p>
						</span>
				</p>
				<h3 style="MARGIN: 13pt 0cm 13pt 24pt; TEXT-INDENT: -24pt; tab-stops: list 24.0pt; mso-list: l0 level2 lfo1">
						<font size="5">
								<span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'">
										<span style="mso-list: Ignore">3.2.</span>
								</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">缺点</span>
						</font>
				</h3>
				<ol style="MARGIN-TOP: 0cm" type="1">
						<li class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; tab-stops: list 36.0pt; mso-list: l1 level1 lfo2">
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">相比简单工厂模式，工厂方法模式客户端编程复杂，每个产品的创建都需要实例化对应的工厂类。</span>
						</li>
						<li class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; tab-stops: list 36.0pt; mso-list: l1 level1 lfo2">
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">相对的扩展性，当需要修改产品结构中的对各产品的时候，需要修改各个工厂（当然也可以直接新加入很多新的产品和工厂，但这样不是又增加了很多无用的遗留类吗，而且现实中很可能要修改客户端代码了。），而简单工厂模式仍然只要修改一个工厂类。</span>
						</li>
						<li class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; tab-stops: list 36.0pt; mso-list: l1 level1 lfo2">
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">现实中常常要使用退化模式，失去多态性。实际设计中经常会有子类新增功能，那么在对应工厂生产该类的时候就需要直接返回该具体类，而不是抽象产品，不然就要向下转型了。</span>
						</li>
				</ol>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<o:p> </o:p>
						</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<o:p> </o:p>
						</span>
				</p>
				<h2 style="MARGIN: 13pt 0cm 13pt 18pt; TEXT-INDENT: -18pt; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
						<a name="_Toc160741682">
								<span lang="EN-US" style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial">
										<span style="mso-list: Ignore">
												<font face="Arial">4.</font>
												<span style="FONT: 7pt 'Times New Roman'">   </span>
										</span>
								</span>
								<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">与其它模式的关系</span>
						</a>
				</h2>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工厂方法模式与模板模式</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<o:p> </o:p>
								<img src="http://zhangpu.17disk.com/downloadServlet?fileId=15448&amp;preview=true" />
						</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
						</span>
				</p>
				<h2 style="MARGIN: 13pt 0cm 13pt 18pt; TEXT-INDENT: -18pt; tab-stops: list 18.0pt; mso-list: l0 level1 lfo1">
						<a name="_Toc160741683">
								<span lang="EN-US" style="mso-fareast-font-family: Arial; mso-bidi-font-family: Arial">
										<span style="mso-list: Ignore">
												<font face="Arial">5.</font>
												<span style="FONT: 7pt 'Times New Roman'">   </span>
										</span>
								</span>
								<span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">参考</span>
						</a>
				</h2>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">《</span>
						<span lang="EN-US">java</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设计模式》</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">阎宏</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">电子工业出版社</span>
				</p>
		</div>
<img src ="http://www.blogjava.net/zpuser/aggbug/101042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zpuser/" target="_blank">阿卜</a> 2007-02-28 00:51 <a href="http://www.blogjava.net/zpuser/archive/2007/02/28/101042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单工厂模式Simple Factory</title><link>http://www.blogjava.net/zpuser/archive/2007/02/27/101035.html</link><dc:creator>阿卜</dc:creator><author>阿卜</author><pubDate>Tue, 27 Feb 2007 15:32:00 GMT</pubDate><guid>http://www.blogjava.net/zpuser/archive/2007/02/27/101035.html</guid><wfw:comment>http://www.blogjava.net/zpuser/comments/101035.html</wfw:comment><comments>http://www.blogjava.net/zpuser/archive/2007/02/27/101035.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zpuser/comments/commentRss/101035.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zpuser/services/trackbacks/101035.html</trackback:ping><description><![CDATA[
		<p>      简单工厂模式也叫静态工厂方法模式（Static Factory Method），是由一个工厂对象隐藏并决定产品类的具体创建的一种创建模式。是工厂方法模式的一种特例。<br /><br /><strong>什么时候使用？</strong><br />1、创建一类有公共接口或父类的对象，并要求隐藏具体实现。<br />2、隐藏子类的创建，提高扩展性。<br /><br /><strong>优点</strong>：隐藏具体产品的创建，客户端独立的创建产品而不用关心具体的创建过程，并在引入新的产品类时不用修改客户调用类。<br /><strong>缺点</strong>：所用产品的创建集中到factory上，成为系统的中心，一旦factory出现问题整个系统崩溃。<br /><br /><strong>标准简单工厂模式</strong><br /><br /><img alt="标准简单工厂模式" src="http://www.blogjava.net/images/blogjava_net/zpuser/20241/r_simple_factory_standard.PNG" /><br /><br />工厂类</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">package</span>
				<span style="COLOR: #000000"> pattern.simplefactory;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_32_69_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_69_Open_Text.style.display='none'; Codehighlighter1_32_69_Closed_Image.style.display='inline'; Codehighlighter1_32_69_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_32_69_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_32_69_Closed_Text.style.display='none'; Codehighlighter1_32_69_Open_Image.style.display='inline'; Codehighlighter1_32_69_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_32_69_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span>
				<span id="Codehighlighter1_32_69_Open_Text">
						<span style="COLOR: #008000">/**</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * 简单工厂模式－工厂类<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> </span>
						<span style="COLOR: #808080">@author</span>
						<span style="COLOR: #008000"> ZhangPu<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> </span>
						<span style="COLOR: #008000">*/</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img id="Codehighlighter1_100_468_Open_Image" onclick="this.style.display='none'; Codehighlighter1_100_468_Open_Text.style.display='none'; Codehighlighter1_100_468_Closed_Image.style.display='inline'; Codehighlighter1_100_468_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_100_468_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_100_468_Closed_Text.style.display='none'; Codehighlighter1_100_468_Open_Image.style.display='inline'; Codehighlighter1_100_468_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> ProductFactory </span>
				<span id="Codehighlighter1_100_468_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_100_468_Open_Text">
						<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_106_180_Open_Image" onclick="this.style.display='none'; Codehighlighter1_106_180_Open_Text.style.display='none'; Codehighlighter1_106_180_Closed_Image.style.display='inline'; Codehighlighter1_106_180_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_106_180_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_106_180_Closed_Text.style.display='none'; Codehighlighter1_106_180_Open_Image.style.display='inline'; Codehighlighter1_106_180_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_106_180_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span>
						<span id="Codehighlighter1_106_180_Open_Text">
								<span style="COLOR: #008000">/**</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     * 简单工厂方法：通过类全路径创建产品<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     * </span>
								<span style="COLOR: #808080">@param</span>
								<span style="COLOR: #008000"> className<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     * </span>
								<span style="COLOR: #808080">@return</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />     </span>
								<span style="COLOR: #008000">*/</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img id="Codehighlighter1_233_465_Open_Image" onclick="this.style.display='none'; Codehighlighter1_233_465_Open_Text.style.display='none'; Codehighlighter1_233_465_Closed_Image.style.display='inline'; Codehighlighter1_233_465_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_233_465_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_233_465_Closed_Text.style.display='none'; Codehighlighter1_233_465_Open_Image.style.display='inline'; Codehighlighter1_233_465_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">static</span>
						<span style="COLOR: #000000"> Product factory(String className)</span>
						<span id="Codehighlighter1_233_465_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_233_465_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        Product product </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">null</span>
								<span style="COLOR: #000000">;<br /><img id="Codehighlighter1_279_360_Open_Image" onclick="this.style.display='none'; Codehighlighter1_279_360_Open_Text.style.display='none'; Codehighlighter1_279_360_Closed_Image.style.display='inline'; Codehighlighter1_279_360_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_279_360_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_279_360_Closed_Text.style.display='none'; Codehighlighter1_279_360_Open_Image.style.display='inline'; Codehighlighter1_279_360_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">try</span>
								<span style="COLOR: #000000"> </span>
								<span id="Codehighlighter1_279_360_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_279_360_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            product </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> (Product)Class.forName(className).newInstance();<br /><img id="Codehighlighter1_382_435_Open_Image" onclick="this.style.display='none'; Codehighlighter1_382_435_Open_Text.style.display='none'; Codehighlighter1_382_435_Closed_Image.style.display='inline'; Codehighlighter1_382_435_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_382_435_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_382_435_Closed_Text.style.display='none'; Codehighlighter1_382_435_Open_Image.style.display='inline'; Codehighlighter1_382_435_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">catch</span>
								<span style="COLOR: #000000"> (Exception e) </span>
								<span id="Codehighlighter1_382_435_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_382_435_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
										<span style="COLOR: #0000ff">throw</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">new</span>
										<span style="COLOR: #000000"> RuntimeException(e);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> product;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<br />抽象产品接口<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> pattern.simplefactory;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_32_46_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_46_Open_Text.style.display='none'; Codehighlighter1_32_46_Closed_Image.style.display='inline'; Codehighlighter1_32_46_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_32_46_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_32_46_Closed_Text.style.display='none'; Codehighlighter1_32_46_Open_Image.style.display='inline'; Codehighlighter1_32_46_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_32_46_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span><span id="Codehighlighter1_32_46_Open_Text"><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * 产品接口<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_73_108_Open_Image" onclick="this.style.display='none'; Codehighlighter1_73_108_Open_Text.style.display='none'; Codehighlighter1_73_108_Closed_Image.style.display='inline'; Codehighlighter1_73_108_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_73_108_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_73_108_Closed_Text.style.display='none'; Codehighlighter1_73_108_Open_Image.style.display='inline'; Codehighlighter1_73_108_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">interface</span><span style="COLOR: #000000"> Product </span><span id="Codehighlighter1_73_108_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_73_108_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> String getName();    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />具体产品类<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> pattern.simplefactory;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_32_63_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_63_Open_Text.style.display='none'; Codehighlighter1_32_63_Closed_Image.style.display='inline'; Codehighlighter1_32_63_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_32_63_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_32_63_Closed_Text.style.display='none'; Codehighlighter1_32_63_Open_Image.style.display='inline'; Codehighlighter1_32_63_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_32_63_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span><span id="Codehighlighter1_32_63_Open_Text"><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * 普通产品<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> </span><span style="COLOR: #808080">@author</span><span style="COLOR: #008000"> ZhangPu<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_114_208_Open_Image" onclick="this.style.display='none'; Codehighlighter1_114_208_Open_Text.style.display='none'; Codehighlighter1_114_208_Closed_Image.style.display='inline'; Codehighlighter1_114_208_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_114_208_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_114_208_Closed_Text.style.display='none'; Codehighlighter1_114_208_Open_Image.style.display='inline'; Codehighlighter1_114_208_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> ConcreteProduct </span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000"> Product </span><span id="Codehighlighter1_114_208_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_114_208_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> String name </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">普通产品</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_179_206_Open_Image" onclick="this.style.display='none'; Codehighlighter1_179_206_Open_Text.style.display='none'; Codehighlighter1_179_206_Closed_Image.style.display='inline'; Codehighlighter1_179_206_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_179_206_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_179_206_Closed_Text.style.display='none'; Codehighlighter1_179_206_Open_Image.style.display='inline'; Codehighlighter1_179_206_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> String getName() </span><span id="Codehighlighter1_179_206_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_179_206_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> name;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><br />客户端类<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> pattern.simplefactory;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_32_71_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_71_Open_Text.style.display='none'; Codehighlighter1_32_71_Closed_Image.style.display='inline'; Codehighlighter1_32_71_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_32_71_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_32_71_Closed_Text.style.display='none'; Codehighlighter1_32_71_Open_Image.style.display='inline'; Codehighlighter1_32_71_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_32_71_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span><span id="Codehighlighter1_32_71_Open_Text"><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * client class<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> </span><span style="COLOR: #808080">@author</span><span style="COLOR: #008000"> ZhangPu<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_94_285_Open_Image" onclick="this.style.display='none'; Codehighlighter1_94_285_Open_Text.style.display='none'; Codehighlighter1_94_285_Closed_Image.style.display='inline'; Codehighlighter1_94_285_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_94_285_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_94_285_Closed_Text.style.display='none'; Codehighlighter1_94_285_Open_Image.style.display='inline'; Codehighlighter1_94_285_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Client </span><span id="Codehighlighter1_94_285_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_94_285_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_139_283_Open_Image" onclick="this.style.display='none'; Codehighlighter1_139_283_Open_Text.style.display='none'; Codehighlighter1_139_283_Closed_Image.style.display='inline'; Codehighlighter1_139_283_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_139_283_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_139_283_Closed_Text.style.display='none'; Codehighlighter1_139_283_Open_Image.style.display='inline'; Codehighlighter1_139_283_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> main(String[] args) </span><span id="Codehighlighter1_139_283_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_139_283_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        Product product </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ProductFactory.factory(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">pattern.simplefactory.ConcreteProduct</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(product.getName());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br /><strong>合并抽象产品和产品的简单工厂模式<br /><br /></strong><img src="http://www.blogjava.net/images/blogjava_net/zpuser/20241/r_simple_factory_notabstactproduct.PNG" /><br /><br /><strong>合并产品和工厂的模式</strong><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/zpuser/20241/r_simple_factory_unit.PNG" /><br /><br /><em><font style="BACKGROUND-COLOR: #ffffff" color="#0000ff">请注意与单例模式的区别：<br />1.单例模式构造函数是私有的，不允许外界创建。<br />2.单例模式只有一个实例。</font></em><br /><img src ="http://www.blogjava.net/zpuser/aggbug/101035.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zpuser/" target="_blank">阿卜</a> 2007-02-27 23:32 <a href="http://www.blogjava.net/zpuser/archive/2007/02/27/101035.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多例模式Multiton</title><link>http://www.blogjava.net/zpuser/archive/2007/02/22/100373.html</link><dc:creator>阿卜</dc:creator><author>阿卜</author><pubDate>Thu, 22 Feb 2007 13:45:00 GMT</pubDate><guid>http://www.blogjava.net/zpuser/archive/2007/02/22/100373.html</guid><wfw:comment>http://www.blogjava.net/zpuser/comments/100373.html</wfw:comment><comments>http://www.blogjava.net/zpuser/archive/2007/02/22/100373.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zpuser/comments/commentRss/100373.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zpuser/services/trackbacks/100373.html</trackback:ping><description><![CDATA[      多例模式Multiton基本特性同单例Singleton,由自己创建和管理自身实例，并向系统提供自身实例。不同之处是多例类在同一容器（类加载器）或JVM中可以存在多个实例。<br /><br /><font color="#0000ff"><strong>应用实例：序列键值生成器</strong></font><br /><br />本例采用hqldb作为演示数据库。表结构如下：<br /><br /><font color="#008000">CREATE TABLE KEYTABLE(<br />  KEYNAME VARCHAR(32) NOT NULL PRIMARY KEY,<br />  KEYVALUE int NOT NULL<br />)</font><br /><br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> pattern.multiton;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.sql.Connection;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.sql.Driver;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.sql.DriverManager;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.sql.ResultSet;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.sql.Statement;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_165_377_Open_Image" onclick="this.style.display='none'; Codehighlighter1_165_377_Open_Text.style.display='none'; Codehighlighter1_165_377_Closed_Image.style.display='inline'; Codehighlighter1_165_377_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_165_377_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_165_377_Closed_Text.style.display='none'; Codehighlighter1_165_377_Open_Image.style.display='inline'; Codehighlighter1_165_377_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_165_377_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_165_377_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * Key service&lt;br&gt;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * table strunction:&lt;br/&gt;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * CREATE TABLE KEYTABLE(&lt;br/&gt;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * KEYNAME VARCHAR(32) NOT NULL PRIMARY KEY,&lt;br/&gt;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * KEYVALUE int NOT NULL&lt;br/&gt;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * )&lt;br&gt;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> @author ZhangPu<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> Feb 22, 2007 4:30:47 PM<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_404_2270_Open_Image" onclick="this.style.display='none'; Codehighlighter1_404_2270_Open_Text.style.display='none'; Codehighlighter1_404_2270_Closed_Image.style.display='inline'; Codehighlighter1_404_2270_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_404_2270_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_404_2270_Closed_Text.style.display='none'; Codehighlighter1_404_2270_Open_Image.style.display='inline'; Codehighlighter1_404_2270_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> KeyService </span><span id="Codehighlighter1_404_2270_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_404_2270_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> cache;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> String keyName;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> maxValue;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> nextValue;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img id="Codehighlighter1_569_652_Open_Image" onclick="this.style.display='none'; Codehighlighter1_569_652_Open_Text.style.display='none'; Codehighlighter1_569_652_Closed_Image.style.display='inline'; Codehighlighter1_569_652_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_569_652_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_569_652_Closed_Text.style.display='none'; Codehighlighter1_569_652_Open_Image.style.display='inline'; Codehighlighter1_569_652_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> KeyService(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> cache,String keyName) </span><span id="Codehighlighter1_569_652_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_569_652_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.cache </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> cache;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.keyName </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> keyName;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      retrieveKey();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_659_725_Open_Image" onclick="this.style.display='none'; Codehighlighter1_659_725_Open_Text.style.display='none'; Codehighlighter1_659_725_Closed_Image.style.display='inline'; Codehighlighter1_659_725_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_659_725_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_659_725_Closed_Text.style.display='none'; Codehighlighter1_659_725_Open_Image.style.display='inline'; Codehighlighter1_659_725_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_659_725_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span><span id="Codehighlighter1_659_725_Open_Text"><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     * get next key form keyinfo<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     * <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     * </span><span style="COLOR: #808080">@return</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />     </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_755_861_Open_Image" onclick="this.style.display='none'; Codehighlighter1_755_861_Open_Text.style.display='none'; Codehighlighter1_755_861_Closed_Image.style.display='inline'; Codehighlighter1_755_861_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_755_861_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_755_861_Closed_Text.style.display='none'; Codehighlighter1_755_861_Open_Image.style.display='inline'; Codehighlighter1_755_861_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> getNextKey() </span><span id="Codehighlighter1_755_861_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_755_861_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_790_827_Open_Image" onclick="this.style.display='none'; Codehighlighter1_790_827_Open_Text.style.display='none'; Codehighlighter1_790_827_Closed_Image.style.display='inline'; Codehighlighter1_790_827_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_790_827_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_790_827_Closed_Text.style.display='none'; Codehighlighter1_790_827_Open_Image.style.display='inline'; Codehighlighter1_790_827_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(nextValue </span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000"> maxValue)</span><span id="Codehighlighter1_790_827_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_790_827_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            retrieveKey();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> nextValue</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img id="Codehighlighter1_872_936_Open_Image" onclick="this.style.display='none'; Codehighlighter1_872_936_Open_Text.style.display='none'; Codehighlighter1_872_936_Closed_Image.style.display='inline'; Codehighlighter1_872_936_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_872_936_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_872_936_Closed_Text.style.display='none'; Codehighlighter1_872_936_Open_Image.style.display='inline'; Codehighlighter1_872_936_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_872_936_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span><span id="Codehighlighter1_872_936_Open_Text"><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     * retrieve current value form db.<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     * </span><span style="COLOR: #808080">@return</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />     </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_968_2262_Open_Image" onclick="this.style.display='none'; Codehighlighter1_968_2262_Open_Text.style.display='none'; Codehighlighter1_968_2262_Closed_Image.style.display='inline'; Codehighlighter1_968_2262_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_968_2262_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_968_2262_Closed_Text.style.display='none'; Codehighlighter1_968_2262_Open_Image.style.display='inline'; Codehighlighter1_968_2262_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> retrieveKey()</span><span id="Codehighlighter1_968_2262_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_968_2262_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">retrieve database!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        String sqlUpdate </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">update KEYTABLE set KEYVALUE = KEYVALUE + </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> cache </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> where KEYNAME = '</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">keyName</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        String sqlSelete </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">select KEYVALUE from KEYTABLE where KEYNAME = '</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">keyName</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        Connection conn </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        Statement stmt </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> keyFormDb </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><img id="Codehighlighter1_1346_1956_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1346_1956_Open_Text.style.display='none'; Codehighlighter1_1346_1956_Closed_Image.style.display='inline'; Codehighlighter1_1346_1956_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1346_1956_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1346_1956_Closed_Text.style.display='none'; Codehighlighter1_1346_1956_Open_Image.style.display='inline'; Codehighlighter1_1346_1956_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">try</span><span id="Codehighlighter1_1346_1956_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1346_1956_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            Driver driver </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (Driver)Class.forName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.hsqldb.jdbcDriver</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">).newInstance();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            DriverManager.registerDriver(driver);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            String url </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">jdbc:hsqldb:hsql://localhost/pattern</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            String user </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sa</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            String passwd </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            conn </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> DriverManager.getConnection(url,user,passwd);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            stmt </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> conn.createStatement();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            stmt.executeUpdate(sqlUpdate);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            ResultSet rs </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> stmt.executeQuery(sqlSelete);<br /><img id="Codehighlighter1_1877_1933_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1877_1933_Open_Text.style.display='none'; Codehighlighter1_1877_1933_Closed_Image.style.display='inline'; Codehighlighter1_1877_1933_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1877_1933_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1877_1933_Closed_Text.style.display='none'; Codehighlighter1_1877_1933_Open_Image.style.display='inline'; Codehighlighter1_1877_1933_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(rs </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000"> rs.next())</span><span id="Codehighlighter1_1877_1933_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1877_1933_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                keyFormDb </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> rs.getInt(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            <br /><img id="Codehighlighter1_1975_2185_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1975_2185_Open_Text.style.display='none'; Codehighlighter1_1975_2185_Closed_Image.style.display='inline'; Codehighlighter1_1975_2185_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1975_2185_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1975_2185_Closed_Text.style.display='none'; Codehighlighter1_1975_2185_Open_Image.style.display='inline'; Codehighlighter1_1975_2185_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        }</span></span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(Exception e)</span><span id="Codehighlighter1_1975_2185_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1975_2185_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_1993_2067_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1993_2067_Open_Text.style.display='none'; Codehighlighter1_1993_2067_Closed_Image.style.display='inline'; Codehighlighter1_1993_2067_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1993_2067_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1993_2067_Closed_Text.style.display='none'; Codehighlighter1_1993_2067_Open_Image.style.display='inline'; Codehighlighter1_1993_2067_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_1993_2067_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1993_2067_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                stmt.close();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                conn.close();<br /><img id="Codehighlighter1_2090_2142_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2090_2142_Open_Text.style.display='none'; Codehighlighter1_2090_2142_Closed_Image.style.display='inline'; Codehighlighter1_2090_2142_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2090_2142_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2090_2142_Closed_Text.style.display='none'; Codehighlighter1_2090_2142_Open_Image.style.display='inline'; Codehighlighter1_2090_2142_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            }</span></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (Exception ex) </span><span id="Codehighlighter1_2090_2142_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_2090_2142_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                ex.printStackTrace();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            e.printStackTrace();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        maxValue </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> keyFormDb;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        nextValue </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> keyFormDb </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000"> cache;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> pattern.multiton;<br /><br /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.HashMap;<br /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.Map;<br /><br /></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"><br /> * KeyGenerator with multiton pattern<br /> @author ZhangPu<br /> Feb 22, 2007 5:55:24 PM<br /> </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br /><br /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> KeyGenerator {<br />    <br />    </span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br />     * save keyServices<br />     </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> Map</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String,KeyGenerator</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> KeyGenerators </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> HashMap</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String,KeyGenerator</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">();<br />    </span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br />     * the current instance.<br />     </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> KeyService keyService;<br />    </span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br />     * cache pool size<br />     </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> KEY_CACHE </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">;<br />    <br />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> KeyGenerator(){}<br />    <br />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> KeyGenerator(String keyName){<br />         keyService </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> KeyService(KEY_CACHE,keyName);<br />    }<br />    <br />    </span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br />     * Multiton instance<br />     * </span><span style="COLOR: #808080">@param</span><span style="COLOR: #008000"> keyName<br />     * </span><span style="COLOR: #808080">@return</span><span style="COLOR: #008000"><br />     </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">synchronized</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> KeyGenerator getInstance(String keyName){<br />        <br />        KeyGenerator keyGenerator;<br />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(KeyGenerators.containsKey(keyName)){<br />            keyGenerator </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> KeyGenerators.get(keyName);<br />        }</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">{<br />            keyGenerator </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> KeyGenerator(keyName);<br />            KeyGenerators.put(keyName, keyGenerator);<br />        }<br />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> keyGenerator;<br />    }<br />    <br />    </span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br />     * business method.<br />     * </span><span style="COLOR: #808080">@return</span><span style="COLOR: #008000"><br />     </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> getNextKey(){<br />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> keyService.getNextKey();<br />    }<br />    <br />    <br />}<br /></span></div><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> pattern.multiton;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_27_74_Open_Image" onclick="this.style.display='none'; Codehighlighter1_27_74_Open_Text.style.display='none'; Codehighlighter1_27_74_Closed_Image.style.display='inline'; Codehighlighter1_27_74_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_27_74_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_27_74_Closed_Text.style.display='none'; Codehighlighter1_27_74_Open_Image.style.display='inline'; Codehighlighter1_27_74_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_27_74_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_27_74_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> @author ZhangPu<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> Feb 22, 2007 6:27:22 PM<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_97_389_Open_Image" onclick="this.style.display='none'; Codehighlighter1_97_389_Open_Text.style.display='none'; Codehighlighter1_97_389_Closed_Image.style.display='inline'; Codehighlighter1_97_389_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_97_389_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_97_389_Closed_Text.style.display='none'; Codehighlighter1_97_389_Open_Image.style.display='inline'; Codehighlighter1_97_389_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Client </span><span id="Codehighlighter1_97_389_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_97_389_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_143_387_Open_Image" onclick="this.style.display='none'; Codehighlighter1_143_387_Open_Text.style.display='none'; Codehighlighter1_143_387_Closed_Image.style.display='inline'; Codehighlighter1_143_387_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_143_387_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_143_387_Closed_Text.style.display='none'; Codehighlighter1_143_387_Open_Image.style.display='inline'; Codehighlighter1_143_387_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> main(String[] args) </span><span id="Codehighlighter1_143_387_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_143_387_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        String keyName </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">SYS_RESOURCE</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        KeyGenerator keyGenerator </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> KeyGenerator.getInstance(keyName);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img id="Codehighlighter1_295_381_Open_Image" onclick="this.style.display='none'; Codehighlighter1_295_381_Open_Text.style.display='none'; Codehighlighter1_295_381_Closed_Image.style.display='inline'; Codehighlighter1_295_381_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_295_381_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_295_381_Closed_Text.style.display='none'; Codehighlighter1_295_381_Open_Image.style.display='inline'; Codehighlighter1_295_381_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)</span><span id="Codehighlighter1_295_381_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_295_381_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">time</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">keyGenerator.getNextKey());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><img src ="http://www.blogjava.net/zpuser/aggbug/100373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zpuser/" target="_blank">阿卜</a> 2007-02-22 21:45 <a href="http://www.blogjava.net/zpuser/archive/2007/02/22/100373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单例模式Singleton</title><link>http://www.blogjava.net/zpuser/archive/2007/02/22/100359.html</link><dc:creator>阿卜</dc:creator><author>阿卜</author><pubDate>Thu, 22 Feb 2007 10:48:00 GMT</pubDate><guid>http://www.blogjava.net/zpuser/archive/2007/02/22/100359.html</guid><wfw:comment>http://www.blogjava.net/zpuser/comments/100359.html</wfw:comment><comments>http://www.blogjava.net/zpuser/archive/2007/02/22/100359.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zpuser/comments/commentRss/100359.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zpuser/services/trackbacks/100359.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 单例模式(singleton)在很多系统中都比较常用。我用得最多的就是用来做缓存。最新重新学习设计模式，想整理一下开发中的一些经验和资料上的讲解以备以后查看。Singleton模式要点1.单例类在一个容器中只有一个实例。2.单例类使用静态方法自己提供向客户端提供实例，自己拥有自己的引用。3.必须向整个容器提供自己的实例。单例类的状态1、无状态单例类可以在多个容器或JVM中存在多个实例而正常运行，因...&nbsp;&nbsp;<a href='http://www.blogjava.net/zpuser/archive/2007/02/22/100359.html'>阅读全文</a><img src ="http://www.blogjava.net/zpuser/aggbug/100359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zpuser/" target="_blank">阿卜</a> 2007-02-22 18:48 <a href="http://www.blogjava.net/zpuser/archive/2007/02/22/100359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原创】装饰模式Decorator</title><link>http://www.blogjava.net/zpuser/archive/2006/12/24/89742.html</link><dc:creator>阿卜</dc:creator><author>阿卜</author><pubDate>Sun, 24 Dec 2006 06:36:00 GMT</pubDate><guid>http://www.blogjava.net/zpuser/archive/2006/12/24/89742.html</guid><wfw:comment>http://www.blogjava.net/zpuser/comments/89742.html</wfw:comment><comments>http://www.blogjava.net/zpuser/archive/2006/12/24/89742.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zpuser/comments/commentRss/89742.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zpuser/services/trackbacks/89742.html</trackback:ping><description><![CDATA[装饰（Decorator）模式又名包装（Wrapper）模式。Decorator以对客户端透明的方式扩展对象的功能，是继承的一种代替方案。<br /><br /><b>1.什么时候使用</b><br /><ol><li>需要动态的扩展一个类，这些扩展也可以动态的撤销，并保持原有类的静态定义的情况。</li><li>需要增加由一些基本功能排列组合贰产生的非常强大的功能，并使继承关系变得不实现，典型的Wrapper应用。</li></ol>模拟类图：<br /><br /><img src="file:///C:/Documents%20and%20Settings/pu.zhang/%E6%A1%8C%E9%9D%A2/Decorator.png" alt="" /><img src="http://zhangpu.17disk.com/downloadServlet?fileId=5284" /><br /><span id="lblContent"><p>在装饰模式中的各个角色有：</p><ul><li><font color="#000080">抽象构件（Component）角色：</font>给出一个抽象接口，以规范准备接收附加责任的对象。 
</li><li><font color="#000080">具体构件（Concrete Component）角色：</font>定义一个将要接收附加责任的类。 
</li><li><font color="#000080">装饰（Decorator）角色：</font>持有一个构件（Component）对象的实例，并定义一个与抽象构件接口一致的接口。 
</li><li><font color="#000080">具体装饰（Concrete Decorator）角色：</font>负责给构件对象"贴上"附加的责任。</li></ul></span><br /><b>2.示例代码<br /><br /></b>在一个实际的项目中，给部分用户增加了一个网络硬盘的服务。要对原来的用户注册方法进行扩展完成注册的时候给用户开通和绑定网络硬盘的功能，又要保持原来注册的功能。我考虑使用decorator模式添加一个装饰的用户管理类扩展原有的管理类来实现。<br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br /> * 用户管理抽象接口（Component）<br /> </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">interface</span><span style="color: rgb(0, 0, 0);"> UserManager{<br />  </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> register(User user);<br />}</span></div><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br /> *  原有用户管理具体类（Concrete Component）<br /> </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> DefaultUserManager </span><span style="color: rgb(0, 0, 255);">implements</span><span style="color: rgb(0, 0, 0);"> UserManager{<br />   </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> register(User user){<br />       </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">常规注册实现</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">   }<br />}</span></div><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br /> * 用户管理具体装饰类NetDiskManager(只有一个装饰对象的情况，装饰类和具体装饰类合并)<br /> </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> NetdiskUserManager </span><span style="color: rgb(0, 0, 255);">implements</span><span style="color: rgb(0, 0, 0);"> UserManager{<br />  </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> UserManager userManager;<br />  </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> NetdiskUserManager(UserManager userManager){<br />    </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.userManager </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> userManager;<br />  }<br /><br />  </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> register(User user){<br />    bandingNetdisk(user);<br />    userManager.register(user);<br />  }<br /> <br />  </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> bandingNetdisk(User user){<br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">实现绑定网络硬盘服务。</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">  }<br />}</span></div><b><br /></b><br /><b>3.在JDK-io包中的应用</b><br /><br />在jdk-io包中标准输入输出流等相关类库都大量使用了Decorator模式。如OutputStream与其相关子类的实现。<br /><br /><img src="http://dev.yesky.com/imagelist/05/12/6e5m3969uro1.jpg" /><br />请参考：<a target="_blank" title="http://redlly.blog.hexun.com/2545654_d.html" href="http://redlly.blog.hexun.com/2545654_d.html">http://redlly.blog.hexun.com/2545654_d.html</a><br /><br /><br /><b>4.<span id="lblContent"></span>使用装饰模式的优点和缺点</b><br /><br /><span id="lblContent"><p><strong><font color="#000080">使用装饰模式主要有以下的优点：</font></strong></p><ol><li>装饰模式与继承关系的目的都是要扩展对象的功能，但是装饰模式可以提供比继承更多的灵活性。 
</li><li>通过使用不同的具体装饰类以及这些装饰类的排列组合，设计师可以创造出很多不同行为的组合。 
</li><li>这种比继承更加灵活机动的特性，也同时意味着装饰模式比继承更加易于出错。</li></ol><p><font color="#000080"><strong>使用装饰模式主要有以下的缺点：</strong></font></p><p>由于使用装饰模式，可以比使用继承关系需要较少数目的类。使用较少的类，当然使设计比较易于进行。但是，在另一方面，使用装饰模式会产生比使用继承关系更多的对象。更多的对象会使得查错变得困难，特别是这些对象看上去都很相像。</p></span><br /><b>5.<span id="lblContent"></span>使用装饰模式的讨论</b><br /><br /><p>大多数情况下，装饰模式的实现都比上面定义中给出的示意性实现要简单。对模式进行简化时需要注意以下的情况：</p><p>（1）一个装饰类的接口必须与被装饰类的接口相容。</p><p>（2）尽量保持Component作为一个"轻"类，不要把太多的逻辑和状态放在Component类里。</p><p>（3）如果只有一个ConcreteComponent类而没有抽象的Component类（接口），那么Decorator类经常可以是ConcreteComponent的一个子类。</p><p><span id="lblContent">（4）如果只有一个ConcreteDecorator类，那么就没有必要建立一个单独的Decorator类，而可以把Decorator和ConcreteDecorator的责任合并成一个类。</span></p><p><span id="lblContent"><strong><font color="#000080">透明的装饰模式</font></strong></span></p><p><span id="lblContent"><strong></strong></span>所谓透明是指对客户端程序员来说是针对接口编程，而不是具体的继承或实现类。引用彦博士的《java与模式》的说法是：“<span id="lblContent">必须永远把孙悟空的所有变化都当成孙悟空来对待，而如果把老孙变成的雀儿当成雀儿，而不是老孙，那就被老孙骗了，而这是不应当发生的。</span>”</p><p>下面的做法是对的：</p><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">Component c </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> ConcreteComponent()；<br />Component c1 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> ConcreteDecorator1(c)；<br />Component c2 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> ConcreteDecorator(c1)；<br /></span></div><br />而下面的做法是不对的：<p><span style="color: rgb(0, 0, 0);"><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">ConcreteComponent c </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> ConcreteDecorator()；<br /></span></div><br /></span><span style="color: rgb(0, 0, 0);"></span></p><p><span id="lblContent"><p><strong><font color="#000080">半透明的装饰模式</font></strong></p><p>然而，纯粹的装饰模式很难找到。装饰模式的用意是在不改变接口的前提下，增强所考虑的类的性能。在增强性能的时候，往往需要建立新的公开的方法。即
便是在孙大圣的系统里，也需要新的方法。比如齐天大圣类并没有飞行的能力，而雀儿有。这就意味着雀儿应当有一个新的fly()方法。</p><p>这就导致了大多数的装饰模式的实现都是"半透明"（semi-transparent）的，而不是完全"透明"的。换言之，允许装饰模式改变接口，
增加新的方法。即声明ConcreteDecorator类型的变量，从而可以调用ConcreteDecorator类中才有的方法：</p><div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: rgb(230, 230, 230) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 98%;"><div><span style="color: rgb(0, 0, 0);">齐天大圣 c </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> 大圣本尊()；<br />雀儿 bird </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> 雀儿(c)；<br />bird.fly()；</span></div></div><p>齐天大圣接口根本没有fly()这个方法，而雀儿接口里有这个方法。</p></span></p><br /><p>参考：</p><p>《java与模式》</p><p>google搜索："java decorator"<br /></p><br /><p><br /></p><p><br /><span id="lblContent"></span></p><p><span id="lblContent"><br /></span></p><br /><br /><img src ="http://www.blogjava.net/zpuser/aggbug/89742.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zpuser/" target="_blank">阿卜</a> 2006-12-24 14:36 <a href="http://www.blogjava.net/zpuser/archive/2006/12/24/89742.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>