﻿<?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>C++博客-Anywhere-随笔分类-设计模式学习笔记----创建模式</title><link>http://www.cppblog.com/Aireed/category/11144.html</link><description>水中苇</description><language>zh-cn</language><lastBuildDate>Sun, 09 Aug 2009 20:23:27 GMT</lastBuildDate><pubDate>Sun, 09 Aug 2009 20:23:27 GMT</pubDate><ttl>60</ttl><item><title>Prototype模式.-原型模型</title><link>http://www.cppblog.com/Aireed/archive/2009/08/09/92737.html</link><dc:creator>三水寿</dc:creator><author>三水寿</author><pubDate>Sun, 09 Aug 2009 13:01:00 GMT</pubDate><guid>http://www.cppblog.com/Aireed/archive/2009/08/09/92737.html</guid><wfw:comment>http://www.cppblog.com/Aireed/comments/92737.html</wfw:comment><comments>http://www.cppblog.com/Aireed/archive/2009/08/09/92737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Aireed/comments/commentRss/92737.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Aireed/services/trackbacks/92737.html</trackback:ping><description><![CDATA[实际为一个复制本身类的模式.<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.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Prototype<br><img id=Codehighlighter1_16_110_Open_Image onclick="this.style.display='none'; Codehighlighter1_16_110_Open_Text.style.display='none'; Codehighlighter1_16_110_Closed_Image.style.display='inline'; Codehighlighter1_16_110_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_16_110_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_16_110_Closed_Text.style.display='none'; Codehighlighter1_16_110_Open_Image.style.display='inline'; Codehighlighter1_16_110_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_16_110_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.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_16_110_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Prototype();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">prototype();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;Prototype&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;Clone()</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Child:</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Prototype<br><img id=Codehighlighter1_142_275_Open_Image onclick="this.style.display='none'; Codehighlighter1_142_275_Open_Text.style.display='none'; Codehighlighter1_142_275_Closed_Image.style.display='inline'; Codehighlighter1_142_275_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_142_275_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_142_275_Closed_Text.style.display='none'; Codehighlighter1_142_275_Open_Image.style.display='inline'; Codehighlighter1_142_275_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_142_275_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.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_142_275_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Child();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Child(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;Child&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">c);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Prototype&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">Clone() const;<br><img id=Codehighlighter1_221_259_Open_Image onclick="this.style.display='none'; Codehighlighter1_221_259_Open_Text.style.display='none'; Codehighlighter1_221_259_Closed_Image.style.display='inline'; Codehighlighter1_221_259_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_221_259_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_221_259_Closed_Text.style.display='none'; Codehighlighter1_221_259_Open_Image.style.display='inline'; Codehighlighter1_221_259_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_221_259_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.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_221_259_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Child(</span><span style="COLOR: #000000">*</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">Child();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;</span></div>
主函数:<br>&nbsp;Prototype *pPro=new Child();<br>&nbsp;Prototype *pChild=pPro-&gt;Clone();<br><br><br>这样就可以得到一个子类对象的拷贝了. 
<img src ="http://www.cppblog.com/Aireed/aggbug/92737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Aireed/" target="_blank">三水寿</a> 2009-08-09 21:01 <a href="http://www.cppblog.com/Aireed/archive/2009/08/09/92737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Builder模式</title><link>http://www.cppblog.com/Aireed/archive/2009/07/20/90569.html</link><dc:creator>三水寿</dc:creator><author>三水寿</author><pubDate>Mon, 20 Jul 2009 00:59:00 GMT</pubDate><guid>http://www.cppblog.com/Aireed/archive/2009/07/20/90569.html</guid><wfw:comment>http://www.cppblog.com/Aireed/comments/90569.html</wfw:comment><comments>http://www.cppblog.com/Aireed/archive/2009/07/20/90569.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Aireed/comments/commentRss/90569.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Aireed/services/trackbacks/90569.html</trackback:ping><description><![CDATA[Builder模式:将一个复杂对象的构建与它的表示相分离.使得同样的构建过程可以创建不同的表示.一般情况下,且对象不是直接返回的...<br>定义:<br>先定义一个要构建的类:<br>class Product<br>{<br>public:<br>&nbsp;&nbsp;&nbsp;&nbsp; Product();<br>&nbsp;&nbsp;&nbsp; ~Product();<br>&nbsp;&nbsp;&nbsp; void&nbsp; ProducePart();<br>};<br>class ProductPart//定义组成Product的部分.<br>{<br>&nbsp;&nbsp; ProductPart();<br>&nbsp;&nbsp;&nbsp;&nbsp; ~ProductPart();<br>&nbsp;&nbsp;&nbsp; ProducePart *BuildPart();<br>};<br>然后创建一个Builder抽象类.<br>class builder<br>{<br>&nbsp; public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~builder();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; virtual void ProducePartA(部分一);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; virtual void ProducePartB(部分二);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; virtual void ProducePartC(部分三);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; virtual Product * GetProduct()=0;<br>protected:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //在主函数中一般不直接构造实例....比如:builder *p=new builder..<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Builder();<br>private:<br>};<br>3.定义一个生产具体对象的子builder<br>class childBuilder:public builder<br>{<br>&nbsp;&nbsp; public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; childBuilder();<br>&nbsp;&nbsp;&nbsp;&nbsp; ~childBuilder();<br>&nbsp;&nbsp;&nbsp;&nbsp; void BuildPartA();&nbsp;&nbsp;/*****buildPartX()---start*********/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生产过程<br>&nbsp;&nbsp;&nbsp; ....&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*****buildPartX()---end*********/<br>&nbsp;&nbsp; Product *GetProduct();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //返回生成的实例.....<br>};<br>4 定义一个类来实现某一产品对象的构造过程<br>class con<br>{<br>&nbsp; public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Director(builder *bldr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ~Director();<br>&nbsp;&nbsp;&nbsp;&nbsp; void produce()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //构造产品.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BuildPartA();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BuildPartB();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .....<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>protected;<br>private:<br>&nbsp;&nbsp;&nbsp;&nbsp; Builder *_bldr;//通过_bldr来调用生产过程,完成对象的实现过程.<br>&nbsp;&nbsp; <br>};<br>总结及讨论:builder模式似乎注重构建的过程,不需要返回构建的产品.如果想返回产品的话,可以在con中添加一个Product的指针.然后将该指针作为buildPart函数的参数..来完成product的构建,然后添加一个返回product的指针的函数得到该product.<br>或者在childbuilder中添加一个属性,为product *类型.然后通过GetProduct()得到该Prodcut.<br><br>
<img src ="http://www.cppblog.com/Aireed/aggbug/90569.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Aireed/" target="_blank">三水寿</a> 2009-07-20 08:59 <a href="http://www.cppblog.com/Aireed/archive/2009/07/20/90569.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2.关于Singleton模式</title><link>http://www.cppblog.com/Aireed/archive/2009/07/20/90568.html</link><dc:creator>三水寿</dc:creator><author>三水寿</author><pubDate>Mon, 20 Jul 2009 00:25:00 GMT</pubDate><guid>http://www.cppblog.com/Aireed/archive/2009/07/20/90568.html</guid><wfw:comment>http://www.cppblog.com/Aireed/comments/90568.html</wfw:comment><comments>http://www.cppblog.com/Aireed/archive/2009/07/20/90568.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Aireed/comments/commentRss/90568.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Aireed/services/trackbacks/90568.html</trackback:ping><description><![CDATA[<p>singleton:独身,一个<br>Singleton模式比较简单,利用类的静态成员变量对于它的子类来说就一个拷贝这个特性,在定义类的时候为这个类添加一个静态的该类的指针,同时声明一个静态的方法(只能静态方法才能访问静态变量).这样,在创建这个类的对象的时候,就始终存在一个,唯一一个对象.<br>定义:<br>class Singleton<br>{<br>&nbsp;public:<br>&nbsp;&nbsp;&nbsp;&nbsp; static Singleton *Instance()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(NULL==_instance)//保证该实例不变.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _instance = new Singleton();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return _instance;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;protected:<br>&nbsp;&nbsp;&nbsp; Singleton();//限制了外部访问...<br>private:<br>&nbsp;&nbsp;&nbsp; static Singleton *_instance;<br>};<br></p>
<img src ="http://www.cppblog.com/Aireed/aggbug/90568.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Aireed/" target="_blank">三水寿</a> 2009-07-20 08:25 <a href="http://www.cppblog.com/Aireed/archive/2009/07/20/90568.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Factory &amp;&amp; AbstractFactory;</title><link>http://www.cppblog.com/Aireed/archive/2009/07/10/89733.html</link><dc:creator>三水寿</dc:creator><author>三水寿</author><pubDate>Fri, 10 Jul 2009 08:16:00 GMT</pubDate><guid>http://www.cppblog.com/Aireed/archive/2009/07/10/89733.html</guid><wfw:comment>http://www.cppblog.com/Aireed/comments/89733.html</wfw:comment><comments>http://www.cppblog.com/Aireed/archive/2009/07/10/89733.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Aireed/comments/commentRss/89733.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Aireed/services/trackbacks/89733.html</trackback:ping><description><![CDATA[Factory模式----为一类对象提供创建接口.<br><br>特点:当Factory仅仅提供了创建对象的接口时,这时候可以用模板的形式定义Factory类.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此时的工厂直接生产.<br>例子:<br>代码:<br>Factory类提供一个创建对象的接口:virtual&nbsp;<span style="COLOR: red">class</span> CreateClass()=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //class 代表一个抽象类<br>ClassFactory则实现这个接口,virtual <span style="COLOR: red">class</span> CreateClass(){return&nbsp;new <span style="COLOR: red">class</span>()};&nbsp; //class代表一个对象类.<br><br>使用模板的话:<br>class Factory<br>{<br>public:<br>~Factory();<br>virtual class Createclass()=0;<br>protected:<br>Factory();<br>};<br>typedef&nbsp;class&lt;type&gt;<br>class&nbsp;classFactory:public Factory;<br>{<br>public:<br>&nbsp;&nbsp;&nbsp; classFactory();<br>&nbsp; ~classFactory();<br>&nbsp;&nbsp;&nbsp; type Createclass(){return new type;}<br>};<br><span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><v:shapetype id=_x0000_t75 coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">&nbsp;<v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype></span><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>当Factory不仅提供了创建对象的接口,同时将对象的实例化放到了工厂的子类中.<br><span style="COLOR: red">把Factory看作是总厂,负责提供"技术"．方法;Factory的子类看作是分工厂,负责生产具体的物品.<br></span>这样，生产一种商品就要派生一个子类．为了减少Factory的子类,也可以采用模板的形式定义子类.<br>&nbsp;<br>AbstractFactory模式----为一组对象提供创建接口.<br>
<table style="WIDTH: 1055px; BORDER-COLLAPSE: collapse; HEIGHT: 86px" cellSpacing=0 cellPadding=3 border=1>
    <tbody>
        <tr>
            <td colSpan=6>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AbstractFactory</td>
        </tr>
        <tr>
            <td colSpan=2>ChildFactoryA</td>
            <td colSpan=2>ChildFactoryB</td>
            <td colSpan=2>..</td>
        </tr>
        <tr>
            <td>物品１生产</td>
            <td>物品２生产（或者更多相关的）</td>
            <td>物品3生产</td>
            <td>物品4(more)</td>
            <td></td>
            <td></td>
        </tr>
    </tbody>
</table>
总之,抽象工厂是用来封装创建一组或一类相关对象的接口.<br>
<img src ="http://www.cppblog.com/Aireed/aggbug/89733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Aireed/" target="_blank">三水寿</a> 2009-07-10 16:16 <a href="http://www.cppblog.com/Aireed/archive/2009/07/10/89733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>