
论足球篮球还是乒乓球的运动员都必须在这里注册才能拿到我们国家职业运动员牌照)。一家体育(比如篮球的广东宏远,足球的深圳健力宝)想获得球员为自己效力,就必须通过这个运动员协会。
根据DIP我们可以设计一个“运动员”接口,“足球运动员”和“篮球运动员”(还有其他运动员)都实现“运动员”这个接口。而“运动员协会”就是一个简单工厂类,它负责实例化“运动员”。我们这里的“”就是一个客户端(Client),不同的“”就是不同的客户端。具体如下图表示:
[center]
[/center]
对于不同的对象(无论是八一还是深圳健力宝),他们都是面向“运动员”接口编程,而不用管是“足球运动员”还是“篮球运动员”,也就是说实现了“运动员”接口的具体类“足球运动员”无需暴露给客户端。这也满足了DIP。但具体的(比如足球的深圳健力宝)如何确保自己获取的是自己想要的运动员(健力宝需要的当然是足球运动员)呢?这就需要“运动员协会”这一工厂类了。通过调用“运动员协会”的具体方法,返回不同的实例。这同时也满足了LoD,也就是“深圳健力宝足球”对象不直接与“足球运动员:李毅”对象通信,而是通过他们共同的“朋友”——“国家体育总局”通信。
下面给出各个类的程序,会有助于读者更好的了解笔者之前的介绍。 运动员.java
Java代码
public intece 运动员 { public void 跑(); public void 跳(); }足球运动员.java public class 足球运动员 implements 运动员 { public void 跑(){//跑啊跑 } public void 跳(){ //跳啊跳 } } 篮球运动员.java public class 篮球运动员implements 运动员 { public void 跑(){ //do nothing } public void 跳(){//do nothing } } 体育协会.java public class 体育协会 { public static 运动员注册足球运动员(){ return new 足球运动员(); } public static 运动员 注册篮球运动员(){return new 篮球运动员(); } } .java public class { private 运动员守门员; private 运动员 后卫; private 运动员 前锋; public void test() { this.前锋 =体育协会.注册足球运动员(); this.后卫 = 体育协会.注册足球运动员(); this.守门员 =体育协会.注册足球运动员(); 守门员.跑(); 后卫.跳(); } }
复制代码以上就是简单工厂模式的一个简单实例,读者应该想象不用接口不用工厂而把具体类暴露给客户端的那种混乱情形吧(就好像没了体育总局,各个在市场上自己胡乱的寻找仔细需要的运动员),简单工厂就解决了这种混乱。
我们用OCP看看简单工厂,会发现如果要对系统进行扩展的话治需要增加实现产品接口的产品类(上例表现为“足球运动员”,“篮球运动员”类,比如要增加个“乒乓球运动员”类),而无需对原有的产品类进行修改。这咋一看好像满足OCP,但是实际上还是需要修改代码的——对,就是修改工厂类。上例中如果增加“乒乓球运动员”产品类,就必须相应的修改“体育协会”工厂类,增加个“注册乒乓球运动员”方法。所以可以看出,简单工厂模式是不满足OCP的。
工厂方法模式及其实例
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-27239-1.html
男女比例失调正常因为重男轻女
他的卫心Y㎝6ОЗ一开始我也不信
醉了永远半张脸