Simple Factory模式(又称Static Factory模式),又一个Simple Factory生产成品,而对客户端隐藏产品产生的细节。对象如何生成,生成前是否与其他对象建立依赖关系,客户端都不需要理会,用以将对象生成方式和客户端程序代码隔离。
实现时定义一个产品接口(interface),并透过特定的静态方法来生成产品。
假设有一个音乐盒工厂,购买音乐盒的客人不知道音乐盒是如何制作的,他只需要知道如何播放音乐盒就可以了,以UML类图来表示这个概念:
[img]/upload/attachment/89238/61a9ce67-0a14-3611-b8ae-66dc59da958a.jpg[/img]
如上图所示,MusicBoxDemo代表了客户的角色,它只依赖于IMusicBox接口,而不关心特定的实现,实际如何产生IMusicBox的实例由MusicBoxFactory完成,以一个简单的程序来实现上面这个UML类图:
IMusicBox.java
PianoBox.java
ViolinBox.java
MusicBoxFactory.java
MusicBoxDemo.java
由于客户端只依赖于IMusicBox接口,所以即使你日后改变了createMusicBox()的实现方式(接受不同的music box),着对客户端是一点影响都没有。简单点来说当音乐盒制作方式因技术进步而改变,都不会影响客户如何操作音乐盒,因为用户只需要知道操作接口即可。
来看看Simple Factory的类结构:
[img]/upload/attachment/89240/8caf0d63-b7d7-399a-a5ad-85780f212003.jpg[/img]
客户只要面对Factory,客户依赖于产品接口,产品的具体实现时可以与客户隔离的,他们也是可以抽换的。
将Simple Factory的概念扩充,可以设计出各种物件皆通用的Factory类,作为专门生成、组装、管理对象的容器。
实现时定义一个产品接口(interface),并透过特定的静态方法来生成产品。
假设有一个音乐盒工厂,购买音乐盒的客人不知道音乐盒是如何制作的,他只需要知道如何播放音乐盒就可以了,以UML类图来表示这个概念:
[img]/upload/attachment/89238/61a9ce67-0a14-3611-b8ae-66dc59da958a.jpg[/img]
如上图所示,MusicBoxDemo代表了客户的角色,它只依赖于IMusicBox接口,而不关心特定的实现,实际如何产生IMusicBox的实例由MusicBoxFactory完成,以一个简单的程序来实现上面这个UML类图:
IMusicBox.java
public interface IMusicBox {
public void play();
}
PianoBox.java
public class PianoBox implements IMusicBox {
public void play() {
System.out.println("播放钢琴音乐:)");
}
}
ViolinBox.java
public class ViolinBox implements IMusicBox {
public void play() {
System.out.println("播放小提琴音乐^_^");
}
}
MusicBoxFactory.java
public class MusicBoxFactory {
public static IMusicBox createMusicBox(String name)
throws InstantiationException,
IllegalAccessException,
ClassNotFoundException {
// 这里使用Java的Reflection机制来产生实例
IMusicBox box = (IMusicBox) Class.forName(name).newInstance()
// 也许你还会作一些对box属性设定之类的处理...
// ...
return box;
}
}
MusicBoxDemo.java
public class MusicBoxDemo {
public static void main(String[] args) throws Exception {
playMusicBox(MusicBoxFactory.createMusicBox("PianoBox"));
playMusicBox(MusicBoxFactory.createMusicBox("ViolinBox"));
}
public static void playMusicBox(IMusicBox musicBox) {
musicBox.play();
}
}
由于客户端只依赖于IMusicBox接口,所以即使你日后改变了createMusicBox()的实现方式(接受不同的music box),着对客户端是一点影响都没有。简单点来说当音乐盒制作方式因技术进步而改变,都不会影响客户如何操作音乐盒,因为用户只需要知道操作接口即可。
来看看Simple Factory的类结构:
[img]/upload/attachment/89240/8caf0d63-b7d7-399a-a5ad-85780f212003.jpg[/img]
客户只要面对Factory,客户依赖于产品接口,产品的具体实现时可以与客户隔离的,他们也是可以抽换的。
将Simple Factory的概念扩充,可以设计出各种物件皆通用的Factory类,作为专门生成、组装、管理对象的容器。