穿越的故事 之简单工厂模式
23种设计模式 之简单工厂模式
一、定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
二、优点
良好的封装性,代码结构清晰,扩展性非常优秀,屏蔽产品类,产品类的调用不影响调用者。
三、故事继续(代码示例)
这天一大早,李实名就把空明,曹草,黑子都叫来办公室,刚一进门,李实名就说到:
“近来很忙吧?”
“还好,还好....."谁敢说忙啊?!想被炒鱿鱼啊.....
“最近我们酒楼的整体差不多了,但是主要的是 我们做什么菜呢?你们也知道中华美食太大,很难选择..”
“我们应该选择一个或者两个菜系主打,其他的先放一放......”空明说道。
“没错,我们也是这样想的......”曹草赶紧插一句,同时望了一眼空明。
“那我们做哪种菜系呢?黑子你说。”
“我觉得,现在主流的菜系很多,我们不可能一一做到,不如川菜和粤菜好了?!”
“哦,你们两个呢,觉得黑子说的怎么样?”
“好好,好啊.....”两个家伙忙不迭的说道。
“OK,就这么说定了!哈哈哈......黑子,这段时间你得多操点心啊?”
“没问题!”
于是这酒楼就选择了粤菜和川菜两大菜系做为主打,那要怎么生产呢?这可够黑子头疼的...
首先,菜是产品,厨房是“工厂”,于是我们选择工厂模式(其他的也行)
1 产品的抽象类(就是 菜)
package JianDan;  
public abstract class Cai  
{  
    public abstract void jieShao();  
}
2 川菜 抽象菜的实现类1
package JianDan;  
   
public class ChuanCai extends Cai  
{  
    @Override  
    public void jieShao()  
    {  
        System.out.println("这是川菜,辣的要死!");  
    }  
}
3 粤菜 抽象菜的实现类2
package JianDan;  
public class YueCai extends Cai  
{  
    @Override  
    public void jieShao()  
    {  
        System.out.println("这是粤菜,甜到要死!");  
    }  
      
}
4 厨房 在这里做菜
package JianDan;  
public class ChuFang  
{  
    public static <T extends Cai> T createCai(Class<T> c)  
    {  
        Cai cai = null;  
        try {  
            cai = (Cai)Class.forName(c.getName()).newInstance();  
        }  
        catch (Exception e)   
        {  
            e.printStackTrace();  
        }  
        return (T)cai;  
    }  
}  
5 场景类 生产过程
package JianDan;  
public class Client  
{  
    public static void main(String[] args)  
    {  
        //生产粤菜  
        System.out.println("...........第一种菜系..........");  
        Cai yueCai = ChuFang.createCai(YueCai.class);  
        yueCai.jieShao();  
        //生产川菜  
        System.out.println("...........第二种菜系..........");  
        Cai chuanCai = ChuFang.createCai(ChuanCai.class);  
        chuanCai.jieShao();  
    }  
} 
大功告成,黑子很开心,他叫来李实名和两位同僚,一起视察厨房:
...........第一种菜系..........
这是粤菜,甜到要死!
...........第二种菜系..........
这是川菜,辣的要死!