小偷公司(文三西路口红灯偷盗)—工厂模式 包括(简单工厂,工厂方法,抽象工厂)(一)
Posted on 2010-04-17 00:21 YeanJay 阅读(620) 评论(0) 编辑 收藏 举报一日下班,千里迢迢赶着去吃麦当劳,谁叫城西没有麦当劳,而且这麦当劳也真是,在杭州的点还真是少。吃完回来,骑着公交自行车,来到了文三西路口。
这一路绿灯的就到这里被红灯卡住。忽然间看到一帅哥骑着电瓶车也被红灯卡住,谁知在他的口袋旁边怎么有那么多手啊。果然一群小偷,那帅哥还反应真灵敏,
一回头一扣手,还一口痰吐给那小偷,小偷觉得委屈,想冲上去,但被同伴拉住。唉,可恶的小偷。还一群一群的出洞,果然训练有素啊。
回到家,看了好几年前的牛群和冯巩演“小偷公司”相声,然后想起了之前学过的设计模式,觉得这小偷啊很符合设计模式中的工厂模式。
这一群一群的小偷啊,是有组织有纪律的。这是一个团体,专门负责偷东西的。也就是偷的操作。那一个小偷的群体就是小偷公司,专门训练小偷的,让他们去偷东西,
那就是“小偷公司”。
小偷公司出来的小偷分工明确,让具体的小偷执行不同的偷盗行为,比如,这群人是偷手机的,这群人是偷相机的,这群人是偷钱包的,但是都是继承了偷盗操作的这个类。
而小偷公司只负责产生偷盗这个对象,具体偷什么,是由当天的偷盗总管(客户端)决定,当天吩咐,你你你去偷抢包,你你你去偷手机。这也就是简单工厂的模式了。简单工厂(小偷公司)这个工厂包含了偷盗的所有逻辑,然后根据客户端(当天的偷盗总管)指示,你去偷手机,接下里小偷公司就产生一个偷手机的小偷对象,执行去偷手机了。直接看类图比较清晰:
类图没啥好解释的。一看就明白了。那就直接上代码了,先上JAVA代码,C#的代码放在附件里面直接下载吧。C#的用SharpDevelop 3.0写的。
StealOperation类:
package DesignPattern.SimpleFactory.StealCompany; //import java.io.Console; public abstract class StealOperation { public void Steal() { System.out.println("不知道偷什么!"); } }
stealOperation类是一个抽象类,用来定义抽象的偷的行为
StealCellPhone类:
package DesignPattern.SimpleFactory.StealCompany; public class StealCellPhone extends StealOperation { @Override public void Steal() { // TODO Auto-generated method stub System.out.println("我是偷手机的!OH,YEE!"); } }
继承抽象的偷的类,然后来重写Steal方法。
StealWallet类:
package DesignPattern.SimpleFactory.StealCompany; public class StealWallet extends StealOperation { @Override public void Steal() { // TODO Auto-generated method stub System.out.println("我是偷钱包的!OH,BABY!"); } }
StealCamera类:
package DesignPattern.SimpleFactory.StealCompany; public class StealCamera extends StealOperation { @Override public void Steal() { // TODO Auto-generated method stub System.out.println("我是偷照相机的!OH,YEE!"); } }
简单工厂类StealCompanyFactory:
package DesignPattern.SimpleFactory.StealCompany; public class StealCompanyFactory { /** * 小偷公司通信规约: 偷钱包 :1 偷相机:2 偷手机:3 * * @return */ public static StealOperation CreateStealOperation(int stealInfo) { StealOperation steal = null; switch (stealInfo) { case 1: steal = new StealWallet(); break; case 2: steal = new StealCamera(); break; case 3: steal = new StealCellPhone(); break; default: break; } return steal; } } 简单工厂类中包含了偷的一些逻辑。
测试类:
package DesignPattern.SimpleFactory.StealCompany; public class StealCompanyTest { /** * * 小偷公司通信规约: 偷钱包 :1 偷相机:2 偷手机:3 * * * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub StealOperation operation = StealCompanyFactory.CreateStealOperation(1); operation.Steal(); StealOperation operation2 = StealCompanyFactory.CreateStealOperation(2); operation2.Steal(); StealOperation operation3 = StealCompanyFactory.CreateStealOperation(3); operation3.Steal(); } } 测试类(客户端)去除了对具体偷的方法的依赖。
总结:
经过分析上面的代码也得出了简单工厂的优点就是,在工厂类中包含类中包含了必要的逻辑判断,然后客户端(测试类)中可以
去除对具体产品的依赖。
下面给出经典的简单工厂的类图:
运行的结果:
我是偷钱包的!OH,BABY!
我是偷照相机!OH,YEE!
我是偷手机的!OH,YEE!