小戚园地

Do as I want to do!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

    一日下班,千里迢迢赶着去吃麦当劳,谁叫城西没有麦当劳,而且这麦当劳也真是,在杭州的点还真是少。吃完回来,骑着公交自行车,来到了文三西路口。

这一路绿灯的就到这里被红灯卡住。忽然间看到一帅哥骑着电瓶车也被红灯卡住,谁知在他的口袋旁边怎么有那么多手啊。果然一群小偷,那帅哥还反应真灵敏,

一回头一扣手,还一口痰吐给那小偷,小偷觉得委屈,想冲上去,但被同伴拉住。唉,可恶的小偷。还一群一群的出洞,果然训练有素啊。

    回到家,看了好几年前的牛群和冯巩演“小偷公司”相声,然后想起了之前学过的设计模式,觉得这小偷啊很符合设计模式中的工厂模式。

    这一群一群的小偷啊,是有组织有纪律的。这是一个团体,专门负责偷东西的。也就是偷的操作。那一个小偷的群体就是小偷公司,专门训练小偷的,让他们去偷东西,

那就是“小偷公司”。

    小偷公司出来的小偷分工明确,让具体的小偷执行不同的偷盗行为,比如,这群人是偷手机的,这群人是偷相机的,这群人是偷钱包的,但是都是继承了偷盗操作的这个类。

而小偷公司只负责产生偷盗这个对象,具体偷什么,是由当天的偷盗总管(客户端)决定,当天吩咐,你你你去偷抢包,你你你去偷手机。这也就是简单工厂的模式了。简单工厂(小偷公司)这个工厂包含了偷盗的所有逻辑,然后根据客户端(当天的偷盗总管)指示,你去偷手机,接下里小偷公司就产生一个偷手机的小偷对象,执行去偷手机了。直接看类图比较清晰:

StealCompany

类图没啥好解释的。一看就明白了。那就直接上代码了,先上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();
    }

}
测试类(客户端)去除了对具体偷的方法的依赖。

总结:

  经过分析上面的代码也得出了简单工厂的优点就是,在工厂类中包含类中包含了必要的逻辑判断,然后客户端(测试类)中可以
去除对具体产品的依赖。
下面给出经典的简单工厂的类图:
SimpleFactory 

运行的结果:

我是偷钱包的!OH,BABY!
我是偷照相机!OH,YEE!
我是偷手机的!OH,YEE!

附件:C#版本的简单工厂