工厂模式:关于一个工厂的故事

关于一个工厂的故事
话说有一个生产电视机的工厂,可以生产海信电视机、海尔电视机 。程序设计如下:
/*** 电视机工厂* @author zherop*/public class TVFactory {/*** 生产海尔电视机** @return*/public HaierTV createHaierTV() {return new HaierTV();}/*** 生产海信电视机** @return*/public HisenseTV createHisenseTV() {return new HisenseTV();}}/*** 海尔电视机* @author zherop*/public class HaierTV {public void play() {System.out.println("海尔电视机播放...");}}/*** 海信电视机* @author zherop*/public class HisenseTV {public void play() {System.out.println("海信电视机播放...");}}
一切都是那么美好,随着工厂业务的发展,现在又需要生产华为电视机 。这个时候,厂长找到工程师小曾,让他给出个设计方案 。
于是小曾稍作思考,并想到如下方案:
新增,然后修改
/*** 华为电视机* @author zherop*/public class HuaweiTV {public void play() {System.out.println("华为电视机播放...");}}public class TVFactory {/*** 生产华为电视机* @return*/public HuaweiTV createHuaweiTV() {return new HuaweiTV();}}
咋一看,这么设计还挺自然的 。小曾又想了想,似乎不太对,新增了一个品牌的电视机,就需要去整改一直运作良好的工厂,心想,万一整改的过程中,不小心影响了其他产品线咋办?
于是,小曾陷入沉思,电视机要定一个标准,然后针对这个标准,工厂产品线就可以生产出来,于是乎,方案变成了这样:
电视机标准:
public interface TV {public void play();}
所有品牌电视机都遵循这个标准:
/*** 海尔电视机* @author zherop*/public class HaierTV implements TV {public void play() {System.out.println("海尔电视机播放...");}}/*** 海信电视机* @author zherop*/public class HisenseTV implements TV {public void play() {System.out.println("海信电视机播放...");}}/*** 华为电视机* @author zherop*/public class HuaweiTV implements TV {public void play() {System.out.println("华为电视机播放...");}}
工厂产品线改造:
【工厂模式:关于一个工厂的故事】/*** 电视机工厂* @author zherop*/public class TVFactory {/*** 生产电视机** @return*/public TV createTV(Class tv) {try {return tv.newInstance();} catch (Exception e) {e.printStackTrace();System.out.println("生产过程中发生故障!");}return null;}}
工厂生产测试:

工厂模式:关于一个工厂的故事

文章插图
public class Client {public static void main(String[] args) {TVFactory tvFactory = new TVFactory();// 生产海尔电视机TV tv = tvFactory.createTV(HaierTV.class);// 测试电视机是否正常工作tv.play();}}
这样,即使以后再接其他品牌的单,工厂也不用改造了 。小曾顿时心情愉悦,很有成就感 。
就这样,靠着这个万能的产品线,工厂稳步发展…
随着科技的进步,开始出现了新型的电视机——智慧屏 。智慧屏的生产比普通电视机要复杂得多,工厂现在的设计已经不能满足需求了,厂长又开始着急了,不接这个单?那显示是不可能,如果不更新换代,工厂迟早会淘汰 。于是厂长又找到了小曾 。
小曾思考了下,很自然地想到了把生成电视机的产品线改造下:
/*** 电视机工厂* @author zherop*/public class TVFactory {/*** 生产电视机* * @return*/public TV createTV(Class tv) {try {T product = tv.newInstance();// 如果是智慧屏,特殊加工处理if (tv.getSimpleName().equals("HonorSmartTV")) {processSmartTV(product);}return product;} catch (Exception e) {e.printStackTrace();System.out.println("生产过程中发生故障!");}return null;}private void processSmartTV(TV product) {System.out.println("智慧屏加工!");}}/*** 荣耀智慧屏* @author zherop*/public class HonorSmartTV implements TV {public void play() {System.out.println("荣耀智慧屏播放...");}}