Design Pattern: Simple Factory 模式

文章来源:Gossip@caterpillar

  Simple Factory模式(又称Static Factory模式),一个Simple Factory生产成品,而对客户端隐藏产品产生的细节。实作时定义一个产品介面(interface),并透过特定静态方法来建立成品。
  假设有一个音乐盒工厂,购买音乐盒的客人不用知道音乐盒是如何制作的,他只要知道如何播放音乐盒就可以了,以 UML 类别图来表示以上的概念:
  如上图所示的,MusicBoxDemo代表了客户的角色,它只依赖于IMusicBox介面,而不关心特定的实作,实际如何产生IMusicBox的实例由MusicBoxFactory完成,以一个简单的程式来实现上面这个UML类别图:

[img]http://dl.iteye.com/upload/attachment/0064/2848/f1a1ba2f-642d-3a01-93c1-53771e8319ca.jpg[/img]

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机制来产生实例
// 不过客户端不用管啦
// 以后就算改变了这边的程式,客户端程式是不用更改的
return (IMusicBox) Class.forName(name).newInstance();
}
}


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()中的实作方式,对客户端是一点影响也没有的。来看看Simple Factory的类别结构:

[img]http://dl.iteye.com/upload/attachment/0064/2850/790a77b0-9473-3678-9fbd-bf9d67244a4e.jpg[/img]


  客户只要面对Factory,客户依赖于产品介面,产品的具体实作是可以与客户隔开的,它们也是可以抽换的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值