简单工厂模式(Simple Factory)
甘永春
2023-12-01
<div id="mainContent">
<div class="forFlow">
<div id="post_detail">
<!--done-->
<div id="topics">
<div class="post">
<h1 class="postTitle">
<a id="cb_post_title_url" class="postTitle2" href="http://www.cnblogs.com/Bobby0322/p/4178412.html">深入浅出设计模式——简单工厂模式(Simple Factory)</a>
</h1>
<div class="clear"></div>
<div class="postBody">
<div id="cnblogs_post_body"><p><strong><img src="http://images.cnitblog.com/blog/684470/201412/221545463277492.png" alt=""><br>介绍</strong><br>简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些。因为它至少不是Gof23种设计模式之一。但它在实际的编程中经常被用到,而且思想也非常简单,可以说是工厂方法模式的一个引导,所以我想有必要把它作为第一个讲一下。</p>
<p><strong>模式动机</strong> <br><img src="http://images.cnitblog.com/blog/684470/201412/221545321247431.png" alt=""><br>考虑一个简单的软件应用场景,一个软件系统可以提供多个外观不同的按钮(如圆形按钮、矩形按钮、菱形按钮等),这些按钮都源自同一个基类,不过在继承基类后不同的子类修改了部分属性从而使得它们可以呈现不同的外观,如果我们希望在使用这些按钮时,<span style="background-color: #ff99cc;">不需要知道这些具体按钮类的名字,只需要知道表示该按钮类的一个参数,并提供一个调用方便的方法,把该参数传入方法即可返回一个相应的按钮对象</span>,此时,就可以使用简单工厂模式。</p>
<p><strong>模式定义</strong><br>简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,<span style="background-color: #ff99cc;">可以根据参数的不同返回不同类的实例</span>。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。</p>
<p><strong>模式结构</strong><br>简单工厂模式包含如下角色:<br>Factory:工厂角色<br>Product:抽象产品角色<br>ConcreteProduct:具体产品角色</p>
<table style="width: 100%;" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="28%">
<p>工厂角色(Creator)</p>
</td>
<td valign="top" width="71%">
<p>是简单工厂模式的核心,它负责实现创建所有具体产品类的实例。工厂类可以被外界直接调用,创建所需的产品对象。</p>
</td>
</tr>
<tr>
<td valign="top" width="28%">
<p>抽象产品角色(Product)</p>
<p> </p>
</td>
<td valign="top" width="71%">
<p>是所有具体产品角色的父类,它负责描述所有实例所共有的公共接口。</p>
<p> </p>
</td>
</tr>
<tr>
<td valign="top" width="28%">
<p>具体产品角色(Concrete Product)</p>
<p> </p>
</td>
<td valign="top" width="71%">
<p>继承自抽象产品角色,一般为多个,是简单工厂模式的创建目标。工厂类返回的都是该角色的某一具体产品。</p>
<p> </p>
</td>
</tr>
</tbody>
</table>
<p><strong>UML图<br><img src="http://images.cnitblog.com/blog/684470/201412/221550459217196.png" alt=""><br></strong></p>
<p><strong>现实生活中例子</strong><br>每次参加不同的聚会或者与不同的人见面,可能穿的衣服是不一样的,比如,你今天上午要与你的一个新客户见面,你可能会对你的老婆说:老婆,给拿件商务装(参数),我要去见我的一个客户,你老婆(工厂类)接到你的请求(商务装参数)后,从衣柜中取出一件商务装(具体产品),交给你。整个过程就完成了。<br>你可能根据不同的条件,要的衣服是不一样的,但要的衣服都是已经在你的衣柜中存在的。并且,每件上衣它们都属于同一种抽象,即它们可以从一个抽象类或接口中继承,这此衣服各自都有一定特征,这些都是条件。然后你要的时候,就可以向你老婆说一种特征,她就会根据这个特征为你服务了。这就是典型的简单工厂模式的应用。</p>
<p><strong>模式实例与解析</strong><br>Product:抽象产品角色 ICoat.cs</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> SimpleFactory
{
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 抽象产品类:上衣
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">interface</span><span style="color: #000000;"> ICoat
{
</span><span style="color: #0000ff;">void</span><span style="color: #000000;"> GetYourCoat();
}
}</span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p>ConcreteProduct:具体产品角色</p>
<p>BusinessCoat.cs</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #0000ff;">using</span><span style="color: #000000;"> System;
</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> SimpleFactory
{
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 具体产品类:商务上衣
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> BusinessCoat : ICoat
{
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> GetYourCoat()
{
Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">商务上衣</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
}
}</span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p><span style="line-height: 1.5;">FashionCoat.cs<br></span></p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #0000ff;">using</span><span style="color: #000000;"> System;
</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> SimpleFactory
{
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 具体产品类:时尚上衣
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> FashionCoat : ICoat
{
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> GetYourCoat()
{
Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">时尚上衣</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
}
}</span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p>Factory:工厂角色 Factory.cs</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #0000ff;">using</span><span style="color: #000000;"> System;
</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> SimpleFactory
{
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 简单工厂模式中的核心部分:工厂类
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Factory
{
</span><span style="color: #0000ff;">public</span> ICoat CreateCoat(<span style="color: #0000ff;">string</span><span style="color: #000000;"> styleName)
{
</span><span style="color: #0000ff;">switch</span><span style="color: #000000;"> (styleName.Trim().ToLower())
{
</span><span style="color: #0000ff;">case</span> <span style="color: #800000;">"</span><span style="color: #800000;">business</span><span style="color: #800000;">"</span>: <span style="color: #008000;">//</span><span style="color: #008000;">商务上衣</span>
<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> BusinessCoat();
</span><span style="color: #0000ff;">case</span> <span style="color: #800000;">"</span><span style="color: #800000;">fashion</span><span style="color: #800000;">"</span>:<span style="color: #008000;">//</span><span style="color: #008000;">时尚上衣</span>
<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> FashionCoat();
</span><span style="color: #0000ff;">default</span><span style="color: #000000;">:
</span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> Exception(<span style="color: #800000;">"</span><span style="color: #800000;">还没有你要的那种衣服</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}
}
}
}</span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p>Program.cs</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #0000ff;">using</span><span style="color: #000000;"> System;
</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> SimpleFactory
{
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 客户类
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">class</span><span style="color: #000000;"> Client
{
</span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> Main(<span style="color: #0000ff;">string</span><span style="color: #000000;">[] args)
{
ICoat food;
</span><span style="color: #0000ff;">try</span><span style="color: #000000;">
{
Factory factory </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Factory();
Console.Write(</span><span style="color: #800000;">"</span><span style="color: #800000;">请选择:时尚上衣 fashion,商务上衣 business\t</span><span style="color: #800000;">"</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">string</span> choice =<span style="color: #000000;"> Console.ReadLine();
</span><span style="color: #0000ff;">switch</span><span style="color: #000000;"> (choice)
{
</span><span style="color: #0000ff;">case</span> <span style="color: #800000;">"</span><span style="color: #800000;">fashion</span><span style="color: #800000;">"</span>:<span style="color: #008000;">//</span><span style="color: #008000;">时尚上衣</span>
Console.Write(<span style="color: #800000;">"</span><span style="color: #800000;">我要的是时尚上衣\t</span><span style="color: #800000;">"</span><span style="color: #000000;">);
food </span>= factory.CreateCoat(<span style="color: #800000;">"</span><span style="color: #800000;">fashion</span><span style="color: #800000;">"</span><span style="color: #000000;">);
food.GetYourCoat();
</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">case</span> <span style="color: #800000;">"</span><span style="color: #800000;">business</span><span style="color: #800000;">"</span>: <span style="color: #008000;">//</span><span style="color: #008000;">商务上衣</span>
Console.Write(<span style="color: #800000;">"</span><span style="color: #800000;">我要的是商务上衣\t</span><span style="color: #800000;">"</span><span style="color: #000000;">);
food </span>= factory.CreateCoat(<span style="color: #800000;">"</span><span style="color: #800000;">business</span><span style="color: #800000;">"</span><span style="color: #000000;">);
food.GetYourCoat();
</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">default</span><span style="color: #000000;">:
Console.Write(</span><span style="color: #800000;">"</span><span style="color: #800000;">还没有你要的那种衣服\t</span><span style="color: #800000;">"</span><span style="color: #000000;">);
</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;
}
Console.ReadLine();
}
</span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}</span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" οnclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p><img src="http://images.cnitblog.com/blog/684470/201412/221556097184942.png" alt=""></p>
<p><strong><span style="line-height: 1.5;">体系结构<br><img src="http://images.cnitblog.com/blog/684470/201412/221556383271236.png" alt=""><br></span></strong></p>
<p><strong>模式分析</strong><br>将对象的创建和对象本身业务处理分离可以降低系统的耦合度,使得两者修改起来都相对容易。 <br>在调用工厂类的工厂方法时,由于工厂方法是静态方法,使用起来很方便,可通过类名直接调用,而且只需要传入一个简单的参数即可,在实际开发中,还可以在调用时将所传入的参数保存在XML等格式的配置文件中,修改参数时无须修改任何源代码。<br>简单工厂模式<span style="background-color: #ff99cc;">最大的问题在于工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则是相违背的</span>。<br>简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。</p>
<p><strong>模式优缺点</strong></p>
<ul>
<li><strong>简单工厂模式的优点</strong></li>
</ul>
<p>工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象。<br>客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。<br>通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。</p>
<ul>
<li><strong>简单工厂模式的缺点</strong></li>
</ul>
<p>由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。<br>使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。<br>系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。<br>简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。</p>
<p><strong>模式适用环境</strong><br>在以下情况下可以使用简单工厂模式:<br>工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。<br>客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。</p>
<p><strong>小结</strong><br>创建型模式对类的实例化过程进行了抽象,能够将对象的创建与对象的使用过程分离。<br>简单工厂模式又称为静态工厂方法模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。<br>简单工厂模式包含三个角色:工厂角色负责实现创建所有实例的内部逻辑;抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口;具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。<br>简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。<br><span style="background-color: #ff99cc;">简单工厂模式最大的优点在于实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责,但是其最大的缺点在于工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码将会非常复杂。</span><br>简单工厂模式适用情况包括:工厂类负责创建的对象比较少;客户端只知道传入工厂类的参数,对于如何创建对象不关心。</p></div><div id="MySignature"></div>
<div class="clear"></div>
<div id="blog_post_info_block">
<div id="BlogPostCategory">分类: <a href="http://www.cnblogs.com/Bobby0322/category/642802.html" target="_blank">OOAD</a></div>
<div id="EntryTag"></div>
<div id="blog_post_info"><div id="green_channel">
<a href="javascript:void(0);" id="green_channel_digg" οnclick="DiggIt(4178412,cb_blogId,1);green_channel_success(this,'谢谢推荐!');">好文要顶</a>
<a id="green_channel_follow" οnclick="follow('a4095bd4-ea59-e411-b908-9dcfd8948a71');" href="javascript:void(0);">关注我</a>
<a id="green_channel_favorite" οnclick="AddToWz(cb_entryId);return false;" href="javascript:void(0);">收藏该文</a>
<a id="green_channel_weibo" href="javascript:void(0);" title="分享至新浪微博" οnclick="ShareToTsina()"><img src="//common.cnblogs.com/images/icon_weibo_24.png" alt=""></a>
<a id="green_channel_wechat" href="javascript:void(0);" title="分享至微信" οnclick="shareOnWechat()"><img src="//common.cnblogs.com/images/wechat.png" alt=""></a>
</div>
<div id="author_profile">
<div id="author_profile_info" class="author_profile_info">
<a href="http://home.cnblogs.com/u/Bobby0322/" target="_blank"><img src="//pic.cnblogs.com/face/684470/20141118135648.png" class="author_avatar" alt=""></a>
<div id="author_profile_detail" class="author_profile_info">
<a href="http://home.cnblogs.com/u/Bobby0322/">Bobby0322</a><br>
<a href="http://home.cnblogs.com/u/Bobby0322/followees">关注 - 26</a><br>
<a href="http://home.cnblogs.com/u/Bobby0322/followers">粉丝 - 150</a>
</div>
</div>
<div class="clear"></div>
<div id="author_profile_honor"></div>
<div id="author_profile_follow">
<a href="javascript:void(0);" οnclick="follow('a4095bd4-ea59-e411-b908-9dcfd8948a71');return false;">+加关注</a>
</div>
</div>
<div id="div_digg">
<div class="diggit" οnclick="votePost(4178412,'Digg')">
<span class="diggnum" id="digg_count">1</span>
</div>
<div class="buryit" οnclick="votePost(4178412,'Bury')">
<span class="burynum" id="bury_count">0</span>
</div>
<div class="clear"></div>
<div class="diggword" id="digg_tips">
</div>
</div>
</div>
<div class="clear"></div>
<div id="post_next_prev"><a href="http://www.cnblogs.com/Bobby0322/p/4178333.html" class="p_n_p_prefix">« </a> 上一篇:<a href="http://www.cnblogs.com/Bobby0322/p/4178333.html" title="发布于2014-12-22 15:36">《OOAD与UML那点儿事》目录索引</a><br><a href="http://www.cnblogs.com/Bobby0322/p/4179921.html" class="p_n_p_prefix">» </a> 下一篇:<a href="http://www.cnblogs.com/Bobby0322/p/4179921.html" title="发布于2014-12-23 13:32">深入浅出设计模式——工厂方法模式(Factory Method)</a><br></div>
</div>
</div>
<div class="postDesc">posted @ <span id="post-date">2014-12-22 16:01</span> <a href="http://www.cnblogs.com/Bobby0322/">Bobby0322</a> 阅读(<span id="post_view_count">2661</span>) 评论(<span id="post_comment_count">5</span>) <a href="https://i.cnblogs.com/EditPosts.aspx?postid=4178412" rel="nofollow">编辑</a> <a href="#" οnclick="AddToWz(4178412);return false;">收藏</a></div>
</div>
<script type="text/javascript">var allowComments=true,cb_blogId=202168,cb_entryId=4178412,cb_blogApp=currentBlogApp,cb_blogUserGuid='a4095bd4-ea59-e411-b908-9dcfd8948a71',cb_entryCreatedDate='2014/12/22 16:01:00';loadViewCount(cb_entryId);</script>
</div><!--end: topics 文章、评论容器-->
</div><a name="!comments"></a><div id="blog-comments-placeholder"><div id="comments_pager_top"></div>
<!--done-->
<br>
<div class="feedback_area_title">发表评论</div>
<div class="feedbackNoItems"></div>
<div class="feedbackItem">
<div class="feedbackListSubtitle">
<div class="feedbackManage">
<span class="comment_actions"></span>
</div>
<a href="#3091561" class="layer">#1楼</a><a name="3091561" id="comment_anchor_3091561"></a> <span class="comment_date">2014-12-22 17:04</span> | <a id="a_comment_author_3091561" href="http://www.cnblogs.com/BenAndWang/" target="_blank">顺风椰子皮</a> <a href="http://msg.cnblogs.com/send/%E9%A1%BA%E9%A3%8E%E6%A4%B0%E5%AD%90%E7%9A%AE" title="发送站内短消息" class="sendMsg2This"> </a>
</div>
<div class="feedbackCon">
<div id="comment_body_3091561" class="blog_comment_body">你那老婆的比喻,你老婆知道么 哈哈</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" οnclick="return voteComment(3091561,'Digg',this)">支持(1)</a><a href="javascript:void(0);" class="comment_bury" οnclick="return voteComment(3091561,'Bury',this)">反对(0)</a></div><span id="comment_3091561_avatar" style="display:none;">http://pic.cnblogs.com/face/286936/20160901091708.png</span>
</div>
</div>
<div class="feedbackItem">
<div class="feedbackListSubtitle">
<div class="feedbackManage">
<span class="comment_actions"></span>
</div>
<a href="#3091693" class="layer">#2楼</a><a name="3091693" id="comment_anchor_3091693"></a> <span class="comment_date">2014-12-22 21:12</span> | <a id="a_comment_author_3091693" href="http://www.cnblogs.com/michaellfx/" target="_blank">米高 | Michael</a> <a href="http://msg.cnblogs.com/send/%E7%B1%B3%E9%AB%98%20%7C%20Michael" title="发送站内短消息" class="sendMsg2This"> </a>
</div>
<div class="feedbackCon">
<div id="comment_body_3091693" class="blog_comment_body">部分文字和Head First设计模式一书完全一致</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" οnclick="return voteComment(3091693,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" οnclick="return voteComment(3091693,'Bury',this)">反对(0)</a></div><span id="comment_3091693_avatar" style="display:none;">http://pic.cnblogs.com/face/607344/20140626001557.png</span>
</div>
</div>
<div class="feedbackItem">
<div class="feedbackListSubtitle">
<div class="feedbackManage">
<span class="comment_actions"></span>
</div>
<a href="#3091792" class="layer">#3楼</a><a name="3091792" id="comment_anchor_3091792"></a> <span class="comment_date">2014-12-23 08:10</span> | <a id="a_comment_author_3091792" href="http://www.cnblogs.com/Chareree/" target="_blank">陈-chen</a> <a href="http://msg.cnblogs.com/send/%E9%99%88-chen" title="发送站内短消息" class="sendMsg2This"> </a>
</div>
<div class="feedbackCon">
<div id="comment_body_3091792" class="blog_comment_body">很好的例子。再介绍下抽象方法和方法。</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" οnclick="return voteComment(3091792,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" οnclick="return voteComment(3091792,'Bury',this)">反对(0)</a></div>
</div>
</div>
<div class="feedbackItem">
<div class="feedbackListSubtitle">
<div class="feedbackManage">
<span class="comment_actions"></span>
</div>
<a href="#3091959" class="layer">#4楼</a><a name="3091959" id="comment_anchor_3091959"></a> <span class="comment_date">2014-12-23 10:41</span> | <a id="a_comment_author_3091959" href="http://www.cnblogs.com/jiangdd/" target="_blank">天亦玄</a> <a href="http://msg.cnblogs.com/send/%E5%A4%A9%E4%BA%A6%E7%8E%84" title="发送站内短消息" class="sendMsg2This"> </a>
</div>
<div class="feedbackCon">
<div id="comment_body_3091959" class="blog_comment_body">设计模式在asp.net中有什么实际应用呢</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" οnclick="return voteComment(3091959,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" οnclick="return voteComment(3091959,'Bury',this)">反对(0)</a></div>
</div>
</div>
<div class="feedbackItem">
<div class="feedbackListSubtitle">
<div class="feedbackManage">
<span class="comment_actions"></span>
</div>
<a href="#3093457" class="layer">#5楼</a><a name="3093457" id="comment_anchor_3093457"></a><span id="comment-maxId" style="display:none;">3093457</span><span id="comment-maxDate" style="display:none;">2014/12/25 10:14:39</span> <span class="comment_date">2014-12-25 10:14</span> | <a id="a_comment_author_3093457" href="http://home.cnblogs.com/u/612987/" target="_blank">jacklai</a> <a href="http://msg.cnblogs.com/send/jacklai" title="发送站内短消息" class="sendMsg2This"> </a>
</div>
<div class="feedbackCon">
<div id="comment_body_3093457" class="blog_comment_body">工厂模式是为了高内聚,低耦合,上述简单工厂模式还是满足不了需求,就拿你的例子来说,如果再多件其他类型衣服,你的 switch里面还得加个case.</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" οnclick="return voteComment(3093457,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" οnclick="return voteComment(3093457,'Bury',this)">反对(0)</a></div>
</div>
</div>
<div id="comments_pager_bottom"></div></div><script type="text/javascript">var commentManager = new blogCommentManager();commentManager.renderComments(0);</script>
<div id="comment_form" class="commentform">
<a name="commentform"></a>
<div id="divCommentShow"></div>
<div id="comment_nav"><span id="span_refresh_tips"></span><a href="javascript:void(0);" οnclick="return RefreshCommentList();" id="lnk_RefreshComments" runat="server" clientidmode="Static">刷新评论</a><a href="#" οnclick="return RefreshPage();">刷新页面</a><a href="#top">返回顶部</a></div>
<div id="comment_form_container"><div class="login_tips">注册用户登录后才能发表评论,请 <a rel="nofollow" href="javascript:void(0);" class="underline" οnclick="return login('commentform');">登录</a> 或 <a rel="nofollow" href="javascript:void(0);" class="underline" οnclick="return register();">注册</a>,<a href="http://www.cnblogs.com">访问</a>网站首页。</div></div>
<div class="ad_text_commentbox" id="ad_text_under_commentbox"></div>
<div id="ad_t2"><a href="http://www.ucancode.com/index.htm" target="_blank">【推荐】50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库</a><br><a href="https://www.jiguang.cn/devservice?bky" target="_blank">【推荐】极光开发者服务平台,五大功能一站集齐</a><br><a href="https://dnspod.cloud.tencent.com/act/seckill?fromSource=gwzcw.410370.410370.410370" target="_blank">【推荐】腾讯云域名+云解析 限时折扣抓紧抢购</a><br><a href="http://click.aliyun.com/m/18488/" target="_blank">【推荐】阿里云“全民云计算”优惠升级</a><br><a href="https://cloud.tencent.com/developer/labs?fromSource=gwzcw.330910.330910.330910" target="_blank">【推荐】一小时搭建人工智能应用,让技术更容易入门</a><br></div>
<div id="opt_under_post"></div>
<div id="cnblogs_c1" class="c_ad_block"><a href="http://cn.udacity.com/mlnd/?utm_source=cnblogs&utm_medium=banner&utm_campaign=MLND06" target="_blank"><img width="300" height="250" src="https://images2017.cnblogs.com/news/24442/201708/24442-20170816053533459-1918329004.png" alt="Udacity08.15 - 08.22"></a></div>
<div id="under_post_news"><div class="itnews c_ad_block"><b>最新IT新闻</b>:<br> · <a href="http://news.cnblogs.com/n/576996/" target="_blank">苹果零售店将举办免费星球大战主题讲座</a><br> · <a href="http://news.cnblogs.com/n/576995/" target="_blank">新趋向!我国中小学将设置人工智能课程 推广编程教育</a><br> · <a href="http://news.cnblogs.com/n/576994/" target="_blank">乐视控股切割完毕:贾跃亭亲信集体走人</a><br> · <a href="http://news.cnblogs.com/n/576993/" target="_blank">易到向新东家借款给司机提现 前高管称再拖就垮了</a><br> · <a href="http://news.cnblogs.com/n/576992/" target="_blank">细菌太聪明 比杀死它们更有效的是减缓其生长速度</a><br>» <a href="http://news.cnblogs.com/" title="IT新闻" target="_blank">更多新闻...</a></div></div>
<div id="cnblogs_c2" class="c_ad_block"><a href="https://www.jiguang.cn/devservice?source=bky&hmsr=博客园&hmpl=&hmcu=&hmkw=&hmci=" target="_blank"><img width="468" height="60" src="https://images2017.cnblogs.com/news/24442/201707/24442-20170727100914671-839522651.gif" alt="极光0801"></a></div>
<div id="under_post_kb"><div class="itnews c_ad_block" id="kb_block"><b>最新知识库文章</b>:<br><div id="kb_recent"> · <a href="http://kb.cnblogs.com/page/575829/" target="_blank">做到这一点,你也可以成为优秀的程序员</a><br> · <a href="http://kb.cnblogs.com/page/566880/" target="_blank">写给立志做码农的大学生</a><br> · <a href="http://kb.cnblogs.com/page/569057/" target="_blank">架构腐化之谜</a><br> · <a href="http://kb.cnblogs.com/page/572854/" target="_blank">学会思考,而不只是编程</a><br> · <a href="http://kb.cnblogs.com/page/574767/" target="_blank">编写Shell脚本的最佳实践</a><br></div>» <a href="http://kb.cnblogs.com/" target="_blank">更多知识库文章...</a></div></div>
<div id="HistoryToday" class="c_ad_block"></div>
<script type="text/javascript">
fixPostBody();
setTimeout(function () { incrementViewCount(cb_entryId); }, 50);
deliverAdT2();
deliverAdC1();
deliverAdC2();
loadNewsAndKb();
loadBlogSignature();
LoadPostInfoBlock(cb_blogId, cb_entryId, cb_blogApp, cb_blogUserGuid);
GetPrevNextPost(cb_entryId, cb_blogId, cb_entryCreatedDate);
loadOptUnderPost();
GetHistoryToday(cb_blogId, cb_blogApp, cb_entryCreatedDate);
</script>
</div>
</div><!--end: forFlow -->
</div>