﻿<?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/tenato/category/20743.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 19 Mar 2007 20:03:09 GMT</lastBuildDate><pubDate>Mon, 19 Mar 2007 20:03:09 GMT</pubDate><ttl>60</ttl><item><title>设计模式－旧话重提之类工厂的使用 </title><link>http://www.blogjava.net/tenato/articles/104544.html</link><dc:creator>叶浩</dc:creator><author>叶浩</author><pubDate>Sun, 18 Mar 2007 03:17:00 GMT</pubDate><guid>http://www.blogjava.net/tenato/articles/104544.html</guid><wfw:comment>http://www.blogjava.net/tenato/comments/104544.html</wfw:comment><comments>http://www.blogjava.net/tenato/articles/104544.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tenato/comments/commentRss/104544.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tenato/services/trackbacks/104544.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<a href="http://blog.csdn.net/flysnowjava/archive/2005/02/22/297269.aspx">
						<img height="13" src="http://blog.csdn.net/images/authorship.gif" width="15" border="0" />
						<font color="#000066"> 设计模式－旧话重提之类工厂的使用</font>
				</a>
				<font face="黑体" color="#0707b5">
				</font>
		</div>
		<div class="postText">
				<p>
						<font face="黑体" color="#0707b5" size="3">　　　　　　　　　　　　　　　　<font size="2">作者：<a href="http://vuser.net/"><strong><font color="#003399">janes </font></strong></a><br /></font></font>
						<font face="黑体" size="3">　　<font size="2">工厂模式大家都非常熟悉包括常用的简单工厂、工厂方法、和抽象工厂等几种。总的来说应该这样定义：<font color="#0938f7">定义一个通用的接口用来创建对象。</font>无论是使用哪一种工厂模式目的都相同，那就是<font color="#f73809">“</font><font color="#f73809">把对象的创建和对象的使用过程分离使其可以自由变动，而不会相互影响”</font>。　　　　　　　　　　　　　　     <br />    使用工厂模式可以避免在程序中使用关键字 new 的操作 ，从面向接口或面向抽象的角度来看，new 操作绝对应该避免直接在业务逻辑的类中使用。因为new 操作后面所需的”参数“是具体类的type ，而不是该类的抽象（基类，或接口），这点不符合面向抽象的原则。下面来看一个具体的事例：</font></font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">public interface Vehicle</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">{</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">    void Run();</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">}</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">public class Car : Vehicle</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">{</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">     public void Run()</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">     { </font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">         Console.Write(" Car 's Run");</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">     }</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">}</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">public class Plane : Vehicle</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">{</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">     public void Run()</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">     { </font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">         Console.Write(" Plane 's Run");</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">     }</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">}</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">public class Train: Vehicle</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">{</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">     public void Run()</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">     { </font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">         Console.Write(" Trani 's  Run");</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">     }</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">}</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">public class BusinessRole</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">{</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">     private Vehicle m_Vehicle;</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">     <font color="#f73809">public BusinessRole()</font></font>
				</p>
				<p>
						<font face="黑体" color="#f73809" size="2">     {</font>
				</p>
				<p>
						<font face="黑体" color="#f73809" size="2">           //注意这里</font>
				</p>
				<p>
						<font face="黑体" color="#f73809" size="2">           m_Vehicle = new Car();</font>
				</p>
				<p>
						<font face="黑体" color="#f73809" size="2">　　　　　　或者： m_Vehicle = new Plane(); m_Vehicle = new Train()</font>
				</p>
				<p>
						<font face="黑体" color="#f73809" size="2">　　　　　　　　　</font>
				</p>
				<p>
						<font face="黑体" color="#f73809" size="2">      }</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">     public void DoExec()</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">     {</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">         Console.write("BusinessRole 's exec");</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">         Vehicle.Run();</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">      }</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">}</font>
				</p>
				<p>
						<font face="黑体" color="#030011" size="2">这里是用户实际调用的client类</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">public class Client</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">{</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">    BusinessRole obj = new BusinessRole ()</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">    obj.DoExec();</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">}</font>
				</p>
				<p>
						<font face="黑体" color="#070022" size="2">分析一下上面代码会发现</font>
				</p>
				<p>
						<font face="黑体" color="#070022" size="2">如果改变使用交通工具方式，需要直接更改<font color="#3300ff">BusinessRole<font color="#030011">中的代码</font>，client</font><font color="#070022">端的代码是不受影响的。但是虽然在</font><font color="#3300ff">BusinessRole把字段m_Vehicle定义成了Vehicle<font color="#070022">的接口类型，可是实际并没有给我们代来太多的好处，因为每次改变交通工具的类型都需要更改类</font>BusinessRole</font><font color="#000000">中的业务代码。我自己检查以前做过的项目发现了好多类似这样的”<font color="#f70909">问题</font>“代码。其实这样的问题解决起来非常简单只要使用任何一种工厂方法（根据实际情况的不同选择合适自己使用的工厂方法）把BusinessRole中的new 操作给替换掉就成了。自己的文字表达言语不清，还是用代码来说明问题吧。</font></font>
				</p>
				<p>
						<font face="黑体" size="2">定义一个<font color="#3300ff">VehicleFactory类工厂用来统一创建Vehicle的子类,然后BusinessRole中调用VehicleFactory来创建Vehicle的实例。从而把BusinessRole类和Vehicle的具体实现的子类解偶。也就是说把创建Vehicle的实例和使用Vehicle的各种实例拆分开。创建实例归VehicleFactory工厂来负责，而BusinessRole只负责使用，BusinessRole知道Vehicle的抽象，不去关心具体的实现。</font></font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">public class VehicleFactory</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">{</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">    </font>
						<font face="黑体" color="#3300ff" size="2"> public Vehicle GetVehicle()</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">     {</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">          条件判断</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">　　　　　　return new Car();或new Plane() 或者Train()</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">
						</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">     }</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">}</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">总之　整个思路就是把BusinessRole 类拆分，把创建Vehicle实例的操作独立出来去让一个单独的类（VehicleFactory)来实现，BusinessRole只能感知VehicleFactory 而不去关心VehicleFactory 类的实现。这样以来整个代码块就灵活了许多。</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">　　　如果Vehicle的抽象的业务逻辑有所改变，那么在　BusinessRole 类中相应的逻辑进行改变，这样的改变和对象的创建无关那么VehicleFactory类和Client类不用再去修改代码。例如：</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">Vehicle 的方法改变，比如加上一个参数</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">void Run(int length);</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">那么在BusinessRole 类的方法做相应的改进</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2"> <font face="黑体" color="#3300ff" size="2">         Vehicle.Run(３);</font></font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">　　　　反之，如果Vehicle类的创建过程有所改变那么，只要VehicleFactory的代码进行修改，BusinessRole 和Client不用去修改。</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">　　　　例如：　</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">　　　　Car类增加汽车类型信息</font>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">　　　　 
<p><font face="黑体" color="#3300ff" size="2">public class Car : Vehicle</font></p><p><font face="黑体" color="#3300ff" size="2">{</font></p><p>   private string m_type;</p><p>　　public Car(string carType)</p><p>   {</p><p>       m_Type = carType;</p><p>   }</p><p><font face="黑体" color="#3300ff" size="2">     public void Run()</font></p><p><font face="黑体" color="#3300ff" size="2">     { </font></p><p><font face="黑体" color="#3300ff" size="2">         Console.Write(" Car 's Run");</font></p><p><font face="黑体" color="#3300ff" size="2">     }</font></p><p><font face="黑体" color="#3300ff" size="2">}</font></p></font>
				</p>
				<p>
				</p>
				<p>
						<font face="黑体" color="#3300ff" size="2">那么只要在VehicleFactory中创建Car实例的代码部分进行修改就可以，不会去影响其它部分代码运行。 <br /><br />    前一段时间忙着辞职换工作好久都不更新这个blog了,以后会努力一点的.</font>
				</p>
		</div>
<img src ="http://www.blogjava.net/tenato/aggbug/104544.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tenato/" target="_blank">叶浩</a> 2007-03-18 11:17 <a href="http://www.blogjava.net/tenato/articles/104544.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式[2]-旧话重提之-各种工厂模式</title><link>http://www.blogjava.net/tenato/articles/104542.html</link><dc:creator>叶浩</dc:creator><author>叶浩</author><pubDate>Sun, 18 Mar 2007 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/tenato/articles/104542.html</guid><wfw:comment>http://www.blogjava.net/tenato/comments/104542.html</wfw:comment><comments>http://www.blogjava.net/tenato/articles/104542.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tenato/comments/commentRss/104542.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tenato/services/trackbacks/104542.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 设计模式										[2]-								旧话重提之-各种工厂模式       作者：flysnow																						一、								             																												序言																																...&nbsp;&nbsp;<a href='http://www.blogjava.net/tenato/articles/104542.html'>阅读全文</a><img src ="http://www.blogjava.net/tenato/aggbug/104542.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tenato/" target="_blank">叶浩</a> 2007-03-18 11:00 <a href="http://www.blogjava.net/tenato/articles/104542.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>