📄 simplefactory.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>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模式),一个Simple Factory生产成品,而对客户端隐藏产品产生的细节。实作时定义一个产品介面(interface),并透过特定静态方法来建立成品。<br>
<br>
假设有一个音乐盒工厂,购买音乐盒的客人不用知道音乐盒是如何制作的,他只要知道如何播放音乐盒就可以了,以 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介面,而不关心特定的实作,实际如何产生IMusicBox的实例由MusicBoxFactory完成,以一个简单的程式来实现上面这个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机制来产生实例<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()中的实作方式,对客户端是一点影响也没有的。<br>
<br>
来看看Simple Factory的类别结构:<br>
<div style="text-align: center;"><img style="width: 595px; height: 215px;" alt="SimpleFactory" title="SimpleFactory" src="images/simpleFactory-2.jpg"></div>
<br>
客户只要面对Factory,客户依赖于产品介面,产品的具体实作是可以与客户隔开的,它们也是可以抽换的。<br>
<br>
<br>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -