﻿<?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-wz5270-随笔分类-DesignPattern</title><link>http://www.blogjava.net/wz5270/category/16567.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 03:58:14 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 03:58:14 GMT</pubDate><ttl>60</ttl><item><title>Simple Factory 模式</title><link>http://www.blogjava.net/wz5270/archive/2006/10/25/77162.html</link><dc:creator>尨奇</dc:creator><author>尨奇</author><pubDate>Wed, 25 Oct 2006 04:45:00 GMT</pubDate><guid>http://www.blogjava.net/wz5270/archive/2006/10/25/77162.html</guid><description><![CDATA[         Simple Factory 模式(又称Static Factory模式),一个Simple Factory 生产成品,而对客户端隐藏产品生产细节.实现定义一个产品界面(interface),并通过特定静态方法来建立成品.<br />         假设有一个音乐盒工厂,购买音乐盒的顾客不知道音乐盒是如何制作的,他只要知道如何播放音乐盒就可以了,以UML类图来表示以上概念.<br /><p align="left"><img height="228" alt="simpleFactory-1.jpg" src="http://www.blogjava.net/images/blogjava_net/wz5270/simpleFactory-1.jpg" width="608" border="0" /><br />         如图上所示,MusicBoxDemo代表了客户的角色,它只依赖于IMusicBox界面,而不关心是如何实现的.如何产生IMusicBox由MusicBoxFactory完成.以一个简单的程序来实现上面这个UML类图:<br /></p><ul><li>IMusicBox.java </li></ul><pre>    public interface IMusicBox {<br />     public void play();<br />   }</pre><ul><li>PianoBox.java </li></ul><pre>   public class PianoBox implements IMusicBox {<br />       public void play() {<br />          System.out.println("播放钢琴音乐:)");<br />      }<br />   }<br /></pre><ul><li>ViolinBox.java </li></ul><pre>   public class ViolinBox implements IMusicBox {<br />       public void play() {<br />          System.out.println("播放小提琴音乐^_^");<br />      }<br />   }<br /></pre><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 />     }<br /></pre><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><p align="left">由于客户端只依赖与IMusicBox介面，所以即使您日后改变了createMusicBox()中的实现方式，对客户端是一点影响也没有的.<br /><br />来看看Simple Factory的类结构：<br /><img height="215" alt="simpleFactory-2.jpg" src="http://www.blogjava.net/images/blogjava_net/wz5270/simpleFactory-2.jpg" width="595" border="0" /><br />客户只要面对Factory，客户依赖于产品介面，产品的具体实现是可以与客戶隔开的，它们也是可以抽换的.<br /></p><img src ="http://www.blogjava.net/wz5270/aggbug/77162.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wz5270/" target="_blank">尨奇</a> 2006-10-25 12:45 <a href="http://www.blogjava.net/wz5270/archive/2006/10/25/77162.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>