?? factorymethod.htm
字號:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="css/stdlayout.css" type="text/css">
<link rel="stylesheet" href="css/print.css" type="text/css">
<meta content="text/html; charset=gb2312" http-equiv="content-type">
<title>Factory Method 模式</title>
</head>
<body>
<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>
<h1><a href="CppGossip.html">Design Pattern: Factory Method 模式</a></h1>
考慮一個(gè)狀況,您所經(jīng)營的工廠正在生產(chǎn)一個(gè)新的電視機(jī)產(chǎn)品,現(xiàn)在有一個(gè)問題發(fā)生了,您的電視機(jī)產(chǎn)品所有的組件都可以自行生產(chǎn),像是操作面版、電源、搖控裝置等等等,但熒幕卻必須依賴另一個(gè)廠商或子廠商供應(yīng),這時(shí)您怎么辦?<br>
<br>
您不能將生產(chǎn)進(jìn)度停下了,相反的您必須確定一些事情,您知道有關(guān)于熒幕控制的所有介面,您可以將這些對介面的操作溝通先實(shí)現(xiàn),等到熒幕到了,直接將熒幕與您的半成品組合起來,一個(gè)完整的成品即可出廠。<br>
<br>
Factory
Method模式在一個(gè)抽象類中留下某個(gè)創(chuàng)建元件的抽象方法沒有實(shí)作,其它與元件操作相關(guān)聯(lián)的方法都先依賴于元件所定義的介面,而不是依賴于元件的實(shí)現(xiàn),
當(dāng)您的成品中有一個(gè)或多個(gè)元件無法確定時(shí),您先確定與這些元件的操作介面,然后用元件的抽象操作介面先完成其它的工作,元件的實(shí)作(實(shí)現(xiàn))則推遲至實(shí)現(xiàn)元
件介面的子類完成,一旦元件加入,即可完成您的成品。<br>
<br>
再舉一個(gè)例子,假設(shè)您要完成一個(gè)文件編輯器,您希望這個(gè)編輯器可以適用于所有類型的檔案編輯,例如RTF、DOC、TXT等等,盡管這些文件有著不同的格
式,您先確定的是這些文件必然具備的一些操作介面,例如儲(chǔ)存、開啟、關(guān)閉等等,您用一個(gè)IDocument類型來進(jìn)行操作,這么一來這個(gè)框架就無需考慮實(shí)
際的儲(chǔ)存、開啟等細(xì)節(jié)是如何進(jìn)行的。 <br>
<br>
以 UML 類別圖來表現(xiàn)以下的概念: <br>
<div style="text-align: center;"><img style="width: 565px; height: 357px;" alt="FactoryMethod" title="FactoryMethod" src="images/factoryMethod-1.jpg"><br>
</div>
<br>
AbstractEditor中的createDocument()方法是個(gè)抽象方法,因?yàn)榭蚣懿恢滥鷮?shí)現(xiàn)一個(gè)什么類型的文件,這個(gè)抽象方法將推遲至繼承AbstractEditor的子類中實(shí)現(xiàn)。<br>
<br>
這個(gè)架構(gòu)可用以下簡單的示意程式來作示范,當(dāng)中實(shí)現(xiàn)了一個(gè)RTFDocument,雖然在AbstractEditor中并不知道我們會(huì)套用這個(gè)RTFDocument,但您可以看到,透過多型操作,您的框架可以進(jìn)行對文件的相關(guān)操作。<br>
<ul>
<li> AbstractEditor.java
</li>
</ul>
<pre>public abstract class AbstractEditor {<br> private IDocument document;<br> public abstract IDocument createDocument();<br><br> public void newDocument() { <br> document = createDocument(); <br> document.open();<br> }<br><br> public void saveDocument() { <br> if(document != null) <br> document.save(); <br> }<br><br> public void closeDocument() { <br> if(document != null) <br> document.close(); <br> }<br>} <br></pre>
<br>
<ul>
<li> IDocument.java
</li>
</ul>
<pre>public interface IDocument {<br> public void open();<br> public void save();<br> public void close();<br>} <br></pre>
<br>
<ul>
<li> RTFEditor.java
</li>
</ul>
<pre>public class RTFEditor extends AbstractEditor { <br> public IDocument createDocument() { <br> return new RTFDocument(); <br> } <br>} <br></pre>
<br>
<ul>
<li> RTFDocument.java
</li>
</ul>
<pre>public class RTFDocument implements IDocument {<br> public RTFDocument() { <br> System.out.println("建立RTF文件"); <br> }<br><br> public void open() { <br> System.out.println("開啟文件"); <br> }<br><br> public void save() { <br> System.out.println("儲(chǔ)存文件"); <br> }<br><br> public void close() { <br> System.out.println("關(guān)閉文件"); <br> }<br>}</pre>
<br>
將Factory Method的結(jié)構(gòu)繪出如下:<br>
<div style="text-align: center;"><img style="width: 585px; height: 357px;" alt="FactoryMethod" title="FactoryMethod" src="images/factoryMethod-2.jpg"><br>
</div>
<br>
Factory
Method中的AbstractOperator中擁有一個(gè)抽象的factoryMethod()方法,它負(fù)責(zé)生成一個(gè)IProduct類型的物件,由
于目前還不知道將如何實(shí)現(xiàn)這個(gè)類型,所以將之推遲至子類別中實(shí)現(xiàn),在AbstractOperator中先實(shí)現(xiàn)IProduct操作介面溝通的部份,只要
介面統(tǒng)一了,利用多型操作即可完成各種不同的IProduct類型之物件操作。<br>
<br>
也就是說,對AbstractOperator來說,其操作的IProduct是可以抽換的。<br>
<br>
</body>
</html>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -