首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

设计方式-Simple Factory

2012-10-20 
设计模式--Simple Factory注:这里的设计模式引用自林信良java 学习笔记。相关内容属于原作者所有,这里只是

设计模式--Simple Factory

注:这里的设计模式引用自林信良java 学习笔记。相关内容属于原作者所有,这里只是为了学习,进行转载和相应小修改。

Simple Factory 模式又称为 Static Factory,使用 SimpleFactory 来制造产品对客户端隐藏产品制造细节。实现时定义一个产品的 Interface , 通过静态方法来制造产品。

SimpleFactory 的类图如下所示:
设计方式-Simple Factory

客户(Client) 只面对 Factory, 客户依赖于产品的接口(interface), 这样就将产品的具体实现与客户隔离开了。

举例,假设有一个音乐盒工厂,客户不用知道某种音乐盒如何制造,他只要知道如何播放音乐就可以了,类图如下所示:

设计方式-Simple Factory
上图中 MusicBoxDemo 代表客户,他只依赖于音乐盒接口 IMusicBox, 他不关心具体的音乐盒实现类,具体产生何种的音乐盒实现由工厂类 MusicBoxFactory 完成。

IMusicBox

Java代码
package org.lokvin.example.designpattern.simplefactory;???
??
/**??
* IMusicBox 产品接口??
* @author lokvin??
*??
*/??
public interface IMusicBox {???
??? public void play();???
??
}??
package org.lokvin.example.designpattern.simplefactory;

/**
* IMusicBox 产品接口
* @author lokvin
*
*/
public interface IMusicBox {
public void play();

}



PianoBox

Java代码
package org.lokvin.example.designpattern.simplefactory;???
??
/**??
* PianoBox 产品,实现 IMusicBox 接口??
* @author lokvin??
*??
*/??
public class PianoBox implements IMusicBox {???
??
??? public void play() {???
??????? System.out.println("播放钢琴音乐 ;)");???
??? }???
???????
??
}??
package org.lokvin.example.designpattern.simplefactory;

/**
* PianoBox 产品,实现 IMusicBox 接口
* @author lokvin
*
*/
public class PianoBox implements IMusicBox {

public void play() {
System.out.println("播放钢琴音乐 ;)");
}


}


ViolinBox

Java代码
package org.lokvin.example.designpattern.simplefactory;???
??
/**??
* ViolinBox 产品,实现 IMusicBox 接口??
* @author lokvin??
*??
*/??
public class ViolinBox implements IMusicBox {???
??
??? public void play() {???
??????? System.out.println("播放小提琴音乐 ^_^");???
???????????
??? }???
???????
??
}??
package org.lokvin.example.designpattern.simplefactory;

/**
* ViolinBox 产品,实现 IMusicBox 接口
* @author lokvin
*
*/
public class ViolinBox implements IMusicBox {

public void play() {
System.out.println("播放小提琴音乐 ^_^");

}


}


MusicBoxFactory

Java代码
package org.lokvin.example.designpattern.simplefactory;???
??
/**??
* MusicBoxFactory 音乐盒工厂类,通过方法 createMusicBox()???
* 制造音乐盒,返回 IMusicBox 对象??
* @author lokvin??
*??
*/??
public class MusicBoxFactory {???
??? public static IMusicBox createMusicBox(String name)????
??????? throws InstantiationException, IllegalAccessException, ClassNotFoundException {???
???????????
??????? return (IMusicBox)Class.forName(name).newInstance();???
??? }???
??
}??
package org.lokvin.example.designpattern.simplefactory;

/**
* MusicBoxFactory 音乐盒工厂类,通过方法 createMusicBox()
* 制造音乐盒,返回 IMusicBox 对象
* @author lokvin
*
*/
public class MusicBoxFactory {
public static IMusicBox createMusicBox(String name)
throws InstantiationException, IllegalAccessException, ClassNotFoundException {

return (IMusicBox)Class.forName(name).newInstance();
}

}


MusicBoxDemo

Java代码
package org.lokvin.example.designpattern.simplefactory;???
??
/**??
* MusicBoxDemo 是使用音乐盒的客户类??
* 他只依赖于 IMusicBox 接口??
* @author lokvin??
*??
*/??
public class MusicBoxDemo {???
??? /*??
???? * 播放音乐方法??
???? */??
??? public static void playMusicBox(IMusicBox box) {???
??????? box.play();???
??? }???
???????
??? public static void main(String[] args) throws Exception {???
??????? playMusicBox(MusicBoxFactory.createMusicBox("org.lokvin.example.designpattern.simplefactory.PianoBox"));???
??????? playMusicBox(MusicBoxFactory.createMusicBox("org.lokvin.example.designpattern.simplefactory.ViolinBox"));???
??? }???
??
}??
package org.lokvin.example.designpattern.simplefactory;

/**
* MusicBoxDemo 是使用音乐盒的客户类
* 他只依赖于 IMusicBox 接口
* @author lokvin
*
*/
public class MusicBoxDemo {
/*
* 播放音乐方法
*/
public static void playMusicBox(IMusicBox box) {
box.play();
}

public static void main(String[] args) throws Exception {
playMusicBox(MusicBoxFactory.createMusicBox("org.lokvin.example.designpattern.simplefactory.PianoBox"));
playMusicBox(MusicBoxFactory.createMusicBox("org.lokvin.example.designpattern.simplefactory.ViolinBox"));
}

}


题外话:这里的 UML 类图采用 viso 绘制,感觉不是很方便,不知有没有更小巧方便的工具。林信良老师的教学文章写的非常细致,十分欣赏佩服。



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/songjindian/archive/2010/03/30/5433529.aspx

?

热点排行