⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simplefactory.htm

📁 DesignPattern基于Java方面最好的书
💻 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 + -