穿越的故事 之简单工厂模式
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(); } }
大功告成,黑子很开心,他叫来李实名和两位同僚,一起视察厨房:
...........第一种菜系..........
这是粤菜,甜到要死!
...........第二种菜系..........
这是川菜,辣的要死!