?? simplefactory.htm
字號(hào):
<!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>Simple Factory 模式</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: Simple Factory 模式</a></h1>
Simple Factory模式(又稱Static Factory模式),一個(gè)Simple Factory生產(chǎn)成品,而對(duì)客戶端隱藏產(chǎn)品產(chǎn)生的細(xì)節(jié)。實(shí)作時(shí)定義一個(gè)產(chǎn)品介面(interface),并透過特定靜態(tài)方法來建立成品。<br>
<br>
假設(shè)有一個(gè)音樂盒工廠,購買音樂盒的客人不用知道音樂盒是如何制作的,他只要知道如何播放音樂盒就可以了,以 UML 類別圖來表示以上的概念:<br>
<div style="text-align: center;"><img style="width: 608px; height: 228px;" alt="SimpleFactory" title="SimpleFactory" src="images/simpleFactory-1.jpg"><br>
</div>
如上圖所示的,MusicBoxDemo代表了客戶的角色,它只依賴于IMusicBox介面,而不關(guān)心特定的實(shí)作,實(shí)際如何產(chǎn)生IMusicBox的實(shí)例由MusicBoxFactory完成,以一個(gè)簡單的程式來實(shí)現(xiàn)上面這個(gè)UML類別圖:<br>
<ul>
<li>IMusicBox.java</li>
</ul>
<pre>public interface IMusicBox {<br> public void play();<br>}</pre>
<br>
<ul>
<li>PianoBox.java</li>
</ul>
<pre>public class PianoBox implements IMusicBox {<br> public void play() {<br> System.out.println("撥放鋼琴音樂:)");<br> }<br>}</pre>
<br>
<ul>
<li>ViolinBox.java</li>
</ul>
<pre>public class ViolinBox implements IMusicBox {<br> public void play() {<br> System.out.println("撥放小提琴音樂^_^");<br> }<br>}</pre>
<br>
<ul>
<li>MusicBoxFactory.java</li>
</ul>
<pre>public class MusicBoxFactory {<br> public static IMusicBox createMusicBox(String name) <br> throws InstantiationException, <br> IllegalAccessException, <br> ClassNotFoundException {<br> // 這邊使用的是Java的Reflection機(jī)制來產(chǎn)生實(shí)例<br> // 不過客戶端不用管啦<br> // 以后就算改變了這邊的程式,客戶端程式是不用更改的<br> return (IMusicBox) Class.forName(name).newInstance();<br> }<br>}</pre>
<br>
<ul>
<li>MusicBoxDemo.java</li>
</ul>
<pre>public class MusicBoxDemo {<br> public static void main(String[] args) throws Exception {<br> playMusicBox(MusicBoxFactory.createMusicBox("PianoBox"));<br> playMusicBox(MusicBoxFactory.createMusicBox("ViolinBox"));<br> }<br> <br> public static void playMusicBox(IMusicBox musicBox) {<br> musicBox.play();<br> }<br>}</pre>
<br>
由于客戶端只依賴于IMusicBox介面,所以即使您日后改變了createMusicBox()中的實(shí)作方式,對(duì)客戶端是一點(diǎn)影響也沒有的。<br>
<br>
來看看Simple Factory的類別結(jié)構(gòu):<br>
<div style="text-align: center;"><img style="width: 595px; height: 215px;" alt="SimpleFactory" title="SimpleFactory" src="images/simpleFactory-2.jpg"></div>
<br>
客戶只要面對(duì)Factory,客戶依賴于產(chǎn)品介面,產(chǎn)品的具體實(shí)作是可以與客戶隔開的,它們也是可以抽換的。<br>
<br>
<br>
</body>
</html>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -