﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-欢迎来到小小家院-随笔分类-设计模式</title><link>http://www.blogjava.net/wangxq/category/31184.html</link><description>共同努力,共造辉煌!</description><language>zh-cn</language><lastBuildDate>Mon, 05 May 2008 11:45:58 GMT</lastBuildDate><pubDate>Mon, 05 May 2008 11:45:58 GMT</pubDate><ttl>60</ttl><item><title>命令模式学习笔记</title><link>http://www.blogjava.net/wangxq/archive/2008/05/05/198311.html</link><dc:creator>扭转乾坤</dc:creator><author>扭转乾坤</author><pubDate>Mon, 05 May 2008 01:28:00 GMT</pubDate><guid>http://www.blogjava.net/wangxq/archive/2008/05/05/198311.html</guid><wfw:comment>http://www.blogjava.net/wangxq/comments/198311.html</wfw:comment><comments>http://www.blogjava.net/wangxq/archive/2008/05/05/198311.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxq/comments/commentRss/198311.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxq/services/trackbacks/198311.html</trackback:ping><description><![CDATA[命令模式：将&#8220;请求&#8221;封装成对象，以便使用不同得请求，队列或者日志来参数化其他对象，命令模式也支持可撤销得操作！（Head First Design Patterns ）<br />
优点：解耦了发送者和接受者之间联系。 发送者调用一个操作，接受者接受请求执行相应的动作，因为使用Command模式解耦，发送者无需知道接受者任何接口。<br />
1. 简单的命令模式<br />
命令接口：<br />
<font style="background-color: #c7edcc">
<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 id="Codehighlighter1_25_54_Open_Image" onclick="this.style.display='none'; Codehighlighter1_25_54_Open_Text.style.display='none'; Codehighlighter1_25_54_Closed_Image.style.display='inline'; Codehighlighter1_25_54_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_25_54_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_25_54_Closed_Text.style.display='none'; Codehighlighter1_25_54_Open_Image.style.display='inline'; Codehighlighter1_25_54_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;Command&nbsp;</span><span id="Codehighlighter1_25_54_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_25_54_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;execute();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
关闭灯命令：
<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 id="Codehighlighter1_48_175_Open_Image" onclick="this.style.display='none'; Codehighlighter1_48_175_Open_Text.style.display='none'; Codehighlighter1_48_175_Closed_Image.style.display='inline'; Codehighlighter1_48_175_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_48_175_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_48_175_Closed_Text.style.display='none'; Codehighlighter1_48_175_Open_Image.style.display='inline'; Codehighlighter1_48_175_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;LightOffCommand&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Command&nbsp;</span><span id="Codehighlighter1_48_175_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_48_175_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;Light&nbsp;light;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;<br />
<img id="Codehighlighter1_103_128_Open_Image" onclick="this.style.display='none'; Codehighlighter1_103_128_Open_Text.style.display='none'; Codehighlighter1_103_128_Closed_Image.style.display='inline'; Codehighlighter1_103_128_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_103_128_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_103_128_Closed_Text.style.display='none'; Codehighlighter1_103_128_Open_Image.style.display='inline'; Codehighlighter1_103_128_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;LightOffCommand(Light&nbsp;light)&nbsp;</span><span id="Codehighlighter1_103_128_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_103_128_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.light&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;light;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;<br />
<img id="Codehighlighter1_155_173_Open_Image" onclick="this.style.display='none'; Codehighlighter1_155_173_Open_Text.style.display='none'; Codehighlighter1_155_173_Closed_Image.style.display='inline'; Codehighlighter1_155_173_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_155_173_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_155_173_Closed_Text.style.display='none'; Codehighlighter1_155_173_Open_Image.style.display='inline'; Codehighlighter1_155_173_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;execute()&nbsp;</span><span id="Codehighlighter1_155_173_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_155_173_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;light.off();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></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 id="Codehighlighter1_47_173_Open_Image" onclick="this.style.display='none'; Codehighlighter1_47_173_Open_Text.style.display='none'; Codehighlighter1_47_173_Closed_Image.style.display='inline'; Codehighlighter1_47_173_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_47_173_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_47_173_Closed_Text.style.display='none'; Codehighlighter1_47_173_Open_Image.style.display='inline'; Codehighlighter1_47_173_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;LightOnCommand&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Command&nbsp;</span><span id="Codehighlighter1_47_173_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"  alt="" /></span><span id="Codehighlighter1_47_173_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Light&nbsp;light;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;<br />
<img id="Codehighlighter1_102_127_Open_Image" onclick="this.style.display='none'; Codehighlighter1_102_127_Open_Text.style.display='none'; Codehighlighter1_102_127_Closed_Image.style.display='inline'; Codehighlighter1_102_127_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_102_127_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_102_127_Closed_Text.style.display='none'; Codehighlighter1_102_127_Open_Image.style.display='inline'; Codehighlighter1_102_127_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;LightOnCommand(Light&nbsp;light)&nbsp;</span><span id="Codehighlighter1_102_127_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"  alt="" /></span><span id="Codehighlighter1_102_127_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.light&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;light;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br />
<img id="Codehighlighter1_154_171_Open_Image" onclick="this.style.display='none'; Codehighlighter1_154_171_Open_Text.style.display='none'; Codehighlighter1_154_171_Closed_Image.style.display='inline'; Codehighlighter1_154_171_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_154_171_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_154_171_Closed_Text.style.display='none'; Codehighlighter1_154_171_Open_Image.style.display='inline'; Codehighlighter1_154_171_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;execute()&nbsp;</span><span id="Codehighlighter1_154_171_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"  alt="" /></span><span id="Codehighlighter1_154_171_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;light.on();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></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 id="Codehighlighter1_19_167_Open_Image" onclick="this.style.display='none'; Codehighlighter1_19_167_Open_Text.style.display='none'; Codehighlighter1_19_167_Closed_Image.style.display='inline'; Codehighlighter1_19_167_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_19_167_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_19_167_Closed_Text.style.display='none'; Codehighlighter1_19_167_Open_Image.style.display='inline'; Codehighlighter1_19_167_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Light&nbsp;</span><span id="Codehighlighter1_19_167_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"  alt="" /></span><span id="Codehighlighter1_19_167_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_38_41_Open_Image" onclick="this.style.display='none'; Codehighlighter1_38_41_Open_Text.style.display='none'; Codehighlighter1_38_41_Closed_Image.style.display='inline'; Codehighlighter1_38_41_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_38_41_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_38_41_Closed_Text.style.display='none'; Codehighlighter1_38_41_Open_Image.style.display='inline'; Codehighlighter1_38_41_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Light()&nbsp;</span><span id="Codehighlighter1_38_41_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"  alt="" /></span><span id="Codehighlighter1_38_41_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_62_102_Open_Image" onclick="this.style.display='none'; Codehighlighter1_62_102_Open_Text.style.display='none'; Codehighlighter1_62_102_Closed_Image.style.display='inline'; Codehighlighter1_62_102_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_62_102_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_62_102_Closed_Text.style.display='none'; Codehighlighter1_62_102_Open_Image.style.display='inline'; Codehighlighter1_62_102_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;on()&nbsp;</span><span id="Codehighlighter1_62_102_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"  alt="" /></span><span id="Codehighlighter1_62_102_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Light&nbsp;is&nbsp;on</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_124_165_Open_Image" onclick="this.style.display='none'; Codehighlighter1_124_165_Open_Text.style.display='none'; Codehighlighter1_124_165_Closed_Image.style.display='inline'; Codehighlighter1_124_165_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_124_165_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_124_165_Closed_Text.style.display='none'; Codehighlighter1_124_165_Open_Image.style.display='inline'; Codehighlighter1_124_165_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;off()&nbsp;</span><span id="Codehighlighter1_124_165_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"  alt="" /></span><span id="Codehighlighter1_124_165_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Light&nbsp;is&nbsp;off</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></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 id="Codehighlighter1_33_208_Open_Image" onclick="this.style.display='none'; Codehighlighter1_33_208_Open_Text.style.display='none'; Codehighlighter1_33_208_Closed_Image.style.display='inline'; Codehighlighter1_33_208_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_33_208_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_33_208_Closed_Text.style.display='none'; Codehighlighter1_33_208_Open_Image.style.display='inline'; Codehighlighter1_33_208_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SimpleRemoteControl&nbsp;</span><span id="Codehighlighter1_33_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"  alt="" /></span><span id="Codehighlighter1_33_208_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Command&nbsp;slot;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br />
<img id="Codehighlighter1_82_83_Open_Image" onclick="this.style.display='none'; Codehighlighter1_82_83_Open_Text.style.display='none'; Codehighlighter1_82_83_Closed_Image.style.display='inline'; Codehighlighter1_82_83_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_82_83_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_82_83_Closed_Text.style.display='none'; Codehighlighter1_82_83_Open_Image.style.display='inline'; Codehighlighter1_82_83_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;SimpleRemoteControl()&nbsp;</span><span id="Codehighlighter1_82_83_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"  alt="" /></span><span id="Codehighlighter1_82_83_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br />
<img id="Codehighlighter1_128_149_Open_Image" onclick="this.style.display='none'; Codehighlighter1_128_149_Open_Text.style.display='none'; Codehighlighter1_128_149_Closed_Image.style.display='inline'; Codehighlighter1_128_149_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_128_149_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_128_149_Closed_Text.style.display='none'; Codehighlighter1_128_149_Open_Image.style.display='inline'; Codehighlighter1_128_149_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setCommand(Command&nbsp;command)&nbsp;</span><span id="Codehighlighter1_128_149_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"  alt="" /></span><span id="Codehighlighter1_128_149_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;slot&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;command;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br />
<img id="Codehighlighter1_185_206_Open_Image" onclick="this.style.display='none'; Codehighlighter1_185_206_Open_Text.style.display='none'; Codehighlighter1_185_206_Closed_Image.style.display='inline'; Codehighlighter1_185_206_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_185_206_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_185_206_Closed_Text.style.display='none'; Codehighlighter1_185_206_Open_Image.style.display='inline'; Codehighlighter1_185_206_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;buttonWasPressed()&nbsp;</span><span id="Codehighlighter1_185_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"  alt="" /></span><span id="Codehighlighter1_185_206_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;slot.execute();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></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 id="Codehighlighter1_31_282_Open_Image" onclick="this.style.display='none'; Codehighlighter1_31_282_Open_Text.style.display='none'; Codehighlighter1_31_282_Closed_Image.style.display='inline'; Codehighlighter1_31_282_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_31_282_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_31_282_Closed_Text.style.display='none'; Codehighlighter1_31_282_Open_Image.style.display='inline'; Codehighlighter1_31_282_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;RemoteControlTest&nbsp;</span><span id="Codehighlighter1_31_282_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"  alt="" /></span><span id="Codehighlighter1_31_282_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_73_280_Open_Image" onclick="this.style.display='none'; Codehighlighter1_73_280_Open_Text.style.display='none'; Codehighlighter1_73_280_Closed_Image.style.display='inline'; Codehighlighter1_73_280_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_73_280_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_73_280_Closed_Text.style.display='none'; Codehighlighter1_73_280_Open_Image.style.display='inline'; Codehighlighter1_73_280_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_73_280_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"  alt="" /></span><span id="Codehighlighter1_73_280_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;SimpleRemoteControl&nbsp;remote&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SimpleRemoteControl();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;Light&nbsp;light&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Light();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;LightOnCommand&nbsp;lightOn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;LightOnCommand(light);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;remote.setCommand(lightOn);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;remote.buttonWasPressed();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
命令模式得特点：<br />
1》 分布登记统一执行：<br />
在作程序时，经常碰到一些需求，先注册一些操作，并不马上执行，等最终确定后统一执行。如一个具体的例子:用户定制自己的报表，可以订阅饼，柱，折线，曲线图，客户选择相应的报表组合，这样对应一个命令集合，在没确定之前用户可以增删这些报表（命令），等最终确定统一交给调用者根据命令执行，生成组合报表。实现了命令分布提出，确定后统一执行的功能。<br />
<br />
2》形如流水线操作：还是出书的例子<br />
//先是一本空白的书：<br />
Book book = new Book(); <br />
//找几个作者<br />
Author author1 ＝ new Author();<br />
Author author2 ＝ new Author();<br />
//把写1，2章的名类分别给这两个作者<br />
Command writeCommand = new Write1Command (author1，book);<br />
Command writeCommand = new Write2Command (author2，book);<br />
List commands ＝ new List ();<br />
Commands.add(writeCommand);<br />
//调用者<br />
Invoker invoker = new invoker();<br />
Invoker.setCommands(commands);<br />
//流水写书<br />
invoker.action()<br />
实际上在aciton这一方法中，invoker按照命令，让两个作者流水写作这本书。（类似一个书的流水线加工工厂）<br />
这样我们的书就被流水加工成功（当然这本书只有两章）<br />
<br />
这样就给了我们一种系统设计的框架，<br />
模型＋工具＋命令<br />
客户端产生命令，命令调用工具操作模型。<br />
Book 相当于模型<br />
Author 相当于和多工具类中的一个<br />
Command 命令<br />
<br />
3》系统需要支持命令的撤消(undo)。提供redo()方法【容易扩展】<br />
我们可以和容易的加入undo和redo，这个不难理解<br />
<br />
4》在Invoker中我们可以实现跟踪，和日志。<br />
<br />
5》当系统需要为某项复制增加形的功能的时候，命令模式使新的功能（表现为一种命令）很容易地被加入到服务种里。<br />
命令联系了工具类即执行类和系统逻辑，<br />
<br />
简化/变化的命令模式：<br />
命令模式的角色比较多，在实际应用种我们可以根据所需要的功能和不需要的功能加以简化。<br />
<br />
1》去掉 调用者<br />
产生命令集合后，我们可以直接在client中迭代执行执行操作<br />
2》 变化 调用者 成为 跟踪者<br />
//调用者<br />
public class Invoker{<br />
List commands; //已经执行完毕的命令集合<br />
public void addCommand (Command command,int i){<br />
commands.add(i,command);<br />
}<br />
public void action(Command command){<br />
//执行操作<br />
command. execute();<br />
//<br />
commands.add(command);<br />
}<br />
}<br />
&#8230;&#8230;&#8230;&#8230;&#8230;<br />
//还可以有丰富的redo和undo操作；(当然一些都给基于命令类提供的相应方法)<br />
}<br />
这样这个类就记录了所有执行过的操作。<br />
<br />
3》去掉 命令 用map替代<br />
我们完全可以用map代替命令，这样无需定义各种命令类<br />
我们改进例子<br />
Author author ＝ new Author();<br />
Publisher publisher ＝ new Publisher ();<br />
Map m = new HashMap;<br />
m.put(author, write);<br />
m.put(author, publisherBook);<br />
在Invoker的action方法：<br />
得代map<br />
运用java反射来调用方法；<br />
<br />
4》去掉执行者：<br />
直接在命令中（execute方法种）加业务逻辑。这样只适合于简单的小的系统.<br />
<br />
其他要说的内容<br />
1》 将某些参数传给某个方发的方式很多，除了当作方法的参数外还可以当作类的成员便俩变量传入：<br />
这就为命令的抽象带来了极大的方便<br />
abstract class Command <br />
{ <br />
abstract public void execute();<br />
}<br />
当我们已经有了执行者（类Test）方法execute（args1，args2 &#8230;.argsn）<br />
我们不必向Command加入execute（args1，args2 &#8230;.argsn）抽象方法，在说即使加了，在我们迭代的时候也无法判断或十分不容易判断哪个命令调用哪个execute方法。<br />
那么我们可以这样<br />
class ConcreteCommand : Command <br />
{ <br />
Test test;<br />
args1<br />
args2<br />
&#8230;..<br />
argsn<br />
public override void Execute() <br />
{ <br />
test. execute (args1，args2 &#8230;.argsn); <br />
} <br />
}<br />
2》 在想跟踪操作的时候，一般为每一个操作对象分配一个调用者，操作对象在调用者中设置。（可以抽象出一个总的调用者，来协调调用每一个具体的调用者）<br />
3》 命令的抽象粒度我觉得是要注意的。<br />
4》 理解思想，不要机械的照搬。消化成自己的，加以灵活的运用和创造在是根本出路。<br />
所谓命令模式的根本思想就是在 先形成命令，在根据命令执行。<br />
<br />
参考：<font style="background-color: #c7edcc"><a href="http://blog.csdn.net/baggio785/archive/2006/05/23/750513.aspx">http://blog.csdn.net/baggio785/archive/2006/05/23/750513.aspx</a></font><br />
</font>
<img src ="http://www.blogjava.net/wangxq/aggbug/198311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxq/" target="_blank">扭转乾坤</a> 2008-05-05 09:28 <a href="http://www.blogjava.net/wangxq/archive/2008/05/05/198311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工厂模式学习笔记</title><link>http://www.blogjava.net/wangxq/archive/2008/05/04/198064.html</link><dc:creator>扭转乾坤</dc:creator><author>扭转乾坤</author><pubDate>Sun, 04 May 2008 06:13:00 GMT</pubDate><guid>http://www.blogjava.net/wangxq/archive/2008/05/04/198064.html</guid><wfw:comment>http://www.blogjava.net/wangxq/comments/198064.html</wfw:comment><comments>http://www.blogjava.net/wangxq/archive/2008/05/04/198064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxq/comments/commentRss/198064.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxq/services/trackbacks/198064.html</trackback:ping><description><![CDATA[<p><font style="background-color: #c7edcc">1. <span style="font-family: 宋体"><font size="3">简单工厂模式又称静态工厂方法模式。从命名上就可以看出这个模式一定很简单。它存在的目的很简单：定义一个用于创建对象的接口。</font> </span><span lang="EN-US" style="font-family: Tahoma"><br />
</span></font><font style="background-color: #c7edcc"><br />
1.public class CarFactory{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static Car getCar(int type){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: Verdana"><strong><span style="color: red"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: Verdana"><strong>if(type == 1){<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new Car1();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></span><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: Verdana"><strong>} else {<br />
</strong></span></span></span></span></span></span></strong></span></span></span></span></span><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return new Car2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
2. public class CarFactory{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static Car getCar(String carClass){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String className = carClass;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></span><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: Verdana"><strong style="color: red">Class c = Class.forName(className);<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></span><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: Verdana"><strong style="color: red">Car car = (Car)c.newInstance();<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;car;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
3. public class CarFactory{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static Car getCar(String carJNDIName){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitialContext ic = new InitialContext();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span></span></span><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: Verdana"><strong><span style="color: red"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: Verdana"><strong>String className = ic.lookUp(carJNDIName);</strong></span></span></span></span></span></span><br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></span><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: Verdana"><strong style="color: red">Car car = (Car)Class.forName(className).newInstance();<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return car;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
</span></span></span></span></span>方式1～3适合于工厂所产生的对象都是属于同一个父类型的，而从方式1～3来看，方式1无疑是最简单的，也是最容易理解和接受的，而方式2和方式3则相对来说要高级一点。高级在哪里呢？我们可以看到，方式1中对对象的创建是使用Hardcode的形式，也即是程序员需要事先知道系统里面存在多少个类型的对象及其对应的编号，一旦增加或删除、修改了对象的类型，则必然引起if-else块的改变，造成了维护的困难。<br />
<br />
而方式2则采用了动态类加载的方式，方式3在方式2的基础上使用了JNDI，更进了一步，其好处是不用出现HardCode的方式，即便你后面的应用增加、删除了对象的类型，我的程序还是保持现在的样子，跟进一步来说：可以去掉那些讨厌的if-else语句。<br />
2. <span style="font-family: 宋体">工厂方法模式去掉了简单工厂模式中工厂方法的静态属性，使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。【<font style="background-color: #c7edcc">实质上它是让工厂实现了抽象的工厂接口，它把具体怎么生产一种东西，放在具体的工厂去实现了，所谓&#8221;延迟到子类中实现&#8220;</font>】</span> <br />
示例一：<br />
<font size="3">public interface Driver{<br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public Car driverCar();<br />
}<br />
public class BenzDriver implements Driver{<br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public Car driverCar(){<br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return new Benz();<br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<br />
}<br />
public class BmwDriver implements Driver{<br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public Car driverCar()<span>&nbsp;&nbsp; </span>{ </font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: 42pt"><span lang="EN-US" style="font-family: Tahoma"><font size="3">return new Bmw(); <br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<br />
}</font> </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><font size="3"><span lang="EN-US" style="font-family: Tahoma">//</span> <span style="font-family: 宋体">应该和具体产品形成对应关系</span> </font><font size="3"><span lang="EN-US" style="font-family: Tahoma">...<br />
//</span> <span style="font-family: 宋体">有请暴发户先生</span> </font><span lang="EN-US" style="font-family: Tahoma"><br />
<font size="3">&nbsp;public class Magnate </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span lang="EN-US" style="font-family: Tahoma"><font size="3">{ </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-family: Tahoma"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public static void main(String[] args) </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-family: Tahoma"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{ </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-family: Tahoma"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>try{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Driver driver = new BenzDriver(); </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-family: Tahoma"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Car car = driver.driverCar(); </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-family: Tahoma"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>car.drive(); </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-family: Tahoma"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font> </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-family: Tahoma"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&#8230;&#8230;</font> </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span lang="EN-US" style="font-family: Tahoma"><font size="3">} <br />
示例二：<br />
</p>
<p><font style="background-color: #c7edcc">public interface Creator<br />
{ <br />
&nbsp; public Prouct factory();<br />
}</font></p>
<p><font style="background-color: #c7edcc">public SubCreator1 implent Creator<br />
{ <br />
&nbsp;&nbsp; public Prouct factory()<br />
&nbsp; { <br />
&nbsp;&nbsp; return new ConcreteProduct1();<br />
&nbsp;&nbsp; }<br />
}</font></p>
<p><font style="background-color: #c7edcc">public SubCreator2 implent Creator<br />
{ <br />
&nbsp;&nbsp; public Prouct factory()<br />
&nbsp; { <br />
&nbsp;&nbsp;&nbsp; return new ConcreteProduct2();<br />
&nbsp;&nbsp; }<br />
}</font><br />
</font></span></p>
<p><font style="background-color: #c7edcc">请注意：返回类型是Product型的！！<br />
这样客户端调用是直接new 一个具体工厂的实例，然后命令它去生产，而对于具体工厂的父类（既工厂接口，接口完全可以改成子类继承父类来实现，只是这样不好，不符合OO的原则），它完全不知道什么产品被生产了，甚至它连那个具体工厂被实例化它都不知道！</font><br />
3. 抽象工厂<br />
public abstract class AbstractFactory{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: Verdana"><strong style="color: red">public&nbsp;abstract Car getCar(String carClass);<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></span><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: Verdana"><strong style="color: red">public abstract Plane getPlane(String planeClass);<br />
</strong>}<br />
<br />
public class Factory1 extends AbstractFactory{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Car getCar(String carClass){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;参考上面的方式1～3<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return car1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Plane getPlane(String planeClass){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;参考上面的方式1～3<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return plane1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
public class Factory2 extends AbstractFactory{<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Car getCar(String carClass){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;参考上面的方式1～3<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return car2;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Plane getPlane(String planeClass){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 参考上面的方式1～3<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return plane2;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
} </span></span></span></span></span><br />
</font></p>
<span style="background-color: #00ff00">方式4是最为复杂而且也是最为强大的一种，它在实现了对象工厂抽象的基础上，又集成了工厂方法。使到不同的工厂可以生产相同类型的产品，但产品的子类可能有所不同。</span>就像上面的工厂1和工厂2都可以生产汽车和飞机一样，他们各自之间可以生产不同系列的产品(抽象工厂)，而且每个系列下面可能有不同的型号(工厂方法)。<br />
<br />
参考资料：<font style="background-color: #c7edcc">http://www.blogjava.net/pengpenglin/archive/2008/01/02/172325.html</font><br />
<font style="background-color: #c7edcc">http://www.blogjava.net/killme2008/archive/2007/03/15/104031.html</font><br />
<font style="background-color: #c7edcc">http://www.blogjava.net/alex/archive/2006/08/29/66479.html</font>
<img src ="http://www.blogjava.net/wangxq/aggbug/198064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxq/" target="_blank">扭转乾坤</a> 2008-05-04 14:13 <a href="http://www.blogjava.net/wangxq/archive/2008/05/04/198064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单实例模式学习笔记</title><link>http://www.blogjava.net/wangxq/archive/2008/05/04/197967.html</link><dc:creator>扭转乾坤</dc:creator><author>扭转乾坤</author><pubDate>Sun, 04 May 2008 00:38:00 GMT</pubDate><guid>http://www.blogjava.net/wangxq/archive/2008/05/04/197967.html</guid><wfw:comment>http://www.blogjava.net/wangxq/comments/197967.html</wfw:comment><comments>http://www.blogjava.net/wangxq/archive/2008/05/04/197967.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxq/comments/commentRss/197967.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxq/services/trackbacks/197967.html</trackback:ping><description><![CDATA[<p><br />
1. 经典的单实例模式例子（非线程安全）：<br />
<font style="background-color: #c7edcc">public class Singleton {<br />
&nbsp;&nbsp;&nbsp;&nbsp;private static Singleton uniqueInstance;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;// other useful instance variables here<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private Singleton() {}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public static Singleton getInstance() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (uniqueInstance == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uniqueInstance = new Singleton();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return uniqueInstance;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;// other useful methods here<br />
}<br />
本例是最经典的单实例模式例子，但是在多线程的情况下就会产生多个实例！<br />
</font></p>
2. 线程安全的例子：<br />
<font style="background-color: #c7edcc">public class Singleton {<br />
&nbsp;private static Singleton uniqueInstance;<br />
&nbsp;<br />
&nbsp;// other useful instance variables here<br />
&nbsp;<br />
&nbsp;private Singleton() {}<br />
&nbsp;<br />
&nbsp;public static synchronized Singleton getInstance() {<br />
&nbsp;&nbsp;if (uniqueInstance == null) {<br />
&nbsp;&nbsp;&nbsp;uniqueInstance = new Singleton();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return uniqueInstance;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;// other useful methods here<br />
}<br />
</font>增加synchronized，会让该方法是线程安全的，但是会引起每个线程在调用该方法时的等待，如果getInstance的性能对应用程序不是很关键（记住，同步方法可能会使getInstance方法得运行效率降低100倍），本方法是最好得方法！<br />
3. 提前实例化，不适用延迟实例化（使用于创建和运行时负担不太繁重或者应用程序总是创建并使用单件实例），它是线程安全得：<br />
<font style="background-color: #c7edcc">public class Singleton {<br />
&nbsp;&nbsp;&nbsp;&nbsp;private static Singleton uniqueInstance = new Singleton();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// other useful instance variables here<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private Singleton() {}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public static Singleton getInstance() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return uniqueInstance;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;// other useful methods here<br />
}<br />
采用这种方法，我们依赖JVM在加载这个类时候马上创建此唯一实例，JVM保证在任何线程访问它之前，一定先创建它!<br />
</font>4. 在java1.5及以后的版本，增加了volatile关键字，可以采用双重检查加锁！<br />
<font style="background-color: #c7edcc">public class Singleton {<br />
&nbsp;private <span style="color: red">volatile </span>static Singleton uniqueInstance;<br />
&nbsp;<br />
&nbsp;private Singleton() {}<br />
&nbsp;<br />
&nbsp;public static Singleton getInstance() {<br />
&nbsp;&nbsp;if (uniqueInstance == null) {<br />
&nbsp;&nbsp;&nbsp;synchronized (Singleton.class) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (uniqueInstance == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uniqueInstance = new Singleton();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return uniqueInstance;<br />
&nbsp;}<br />
}<br />
<span style="color: red">volatile关键字确保：当unigueInstance变量在被初始化成实例时，多个线程能够正确的处理它！（对于关注性能的程序，这种做法可以大大减少时耗）<br />
</span><br />
</font><br />
<br />
<img src ="http://www.blogjava.net/wangxq/aggbug/197967.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxq/" target="_blank">扭转乾坤</a> 2008-05-04 08:38 <a href="http://www.blogjava.net/wangxq/archive/2008/05/04/197967.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>