设计模式系列9---和而不同的工厂方法模式
2016-01-02 13:45
337 查看
现在的手机制造业,在高度的繁荣发展后,流水线的工作基础,吸引了很多厂商为了压低成本,搞一些odm的手机,就是在一个模版的基础上,改下壳,换个商标的样子,就开发布会,说有新的手机!大家快带上你的钱来买,卖得好不好,纯靠营销能力啊。
例如下面的,某情怀和某米的手机,是不是很一样啊?
改一改又是一部手机!
那么,作为工厂,应该怎么搞呢?
我们的工厂盖好了,很简单,就是造部手机出来!
接着我们的工厂提供了一个公模,所有的基础的模版,如果需要定制手机,就在这基础上修改下,我们的智能手机当然啦,很智能,能开机,关机,展示品牌,厉害吧
现在时候来展示我们的手机了,我们的各个大品牌商要开发布会,重新定义手机了,是的,重新定义手机,很牛逼哄哄的!!
先来下我们的革命级别的大米手机:
接着是我们的极具情怀的东半球可能是最厉害的大锤子手机
有了这些基础,我们的各种发布会就可以如期举行,只需要督促下我们各个工厂,叫他们加大马力,赶紧生产,产不出来的我们就饥饿营销下。
现在我们来看下,我们到底怎么生产手机
我们的智能手机就这样生产出来了!是不是很好的感觉?
以后别的手机友商,如果需要生产新的手机,就继承下,然后改下牌子名,就可以拿出去卖了,是不是很好!!!!!
另外如果要搞库存,保留模版,可以弄一个静态的存储!
这样初始化就能降低消耗了。
我们看下我们的工厂方法的类图,是不是很灵活的样子!
我们只需要修改传递过去的手机类型,就可以开始生产手机了!
前面的是简单定制的案例,不过现实可能会需要点复杂的,高度定制的手机,例如那个高逼格的某果手机。曾经为了加上蓝玻璃屏幕,找了一家供应商,别人知道了这事,他股票大涨,但这家供应商的工艺跟不上,没做出来他们需要的玻璃,结果股票大跌,倒闭了,哀伤的故事啊。
对于高度定制的工厂,我们也可以在原有的基础上加点修改,从而达到想要的效果的。
那是抽象工厂方法模型,下次写,欢迎关注。
例如下面的,某情怀和某米的手机,是不是很一样啊?
改一改又是一部手机!
那么,作为工厂,应该怎么搞呢?
代码实现
我们设计出这个工厂的基本方法public class PhoneFactory { public static SmartPhone createSmartPhone(Class c){ SmartPhone phone=null; try { phone = (SmartPhone)Class.forName(c.getName()).newInstance(); } catch (InstantiationException e) { System.out.println("必须指定手机牌子"); } catch (IllegalAccessException e) { System.out.println("手机定义错误"); } catch (ClassNotFoundException e) { System.out.println("没这牌子手机"); } return phone; } }
我们的工厂盖好了,很简单,就是造部手机出来!
public abstract class SmartPhone{ public abstract void showBrand(); public abstract void startUp(); public abstract void shutDown(); }
接着我们的工厂提供了一个公模,所有的基础的模版,如果需要定制手机,就在这基础上修改下,我们的智能手机当然啦,很智能,能开机,关机,展示品牌,厉害吧
现在时候来展示我们的手机了,我们的各个大品牌商要开发布会,重新定义手机了,是的,重新定义手机,很牛逼哄哄的!!
先来下我们的革命级别的大米手机:
public class MiPhone extends SmartPhone{ @Override public void showBrand() { System.out.println(" 这个是大米手机"); } @Override public void startUp() { System.out.println(" 大米手机正在开机"); } @Override public void shutDown() { System.out.println("大米正在关机"); } }
接着是我们的极具情怀的东半球可能是最厉害的大锤子手机
public class HammerPhone extends SmartPhone{ @Override public void showBrand() { System.out.println(" 这个是大锤子手机"); } @Override public void startUp() { System.out.println(" 大锤子手机正在开机"); } @Override public void shutDown() { System.out.println("大锤子正在关机"); } }
有了这些基础,我们的各种发布会就可以如期举行,只需要督促下我们各个工厂,叫他们加大马力,赶紧生产,产不出来的我们就饥饿营销下。
现在我们来看下,我们到底怎么生产手机
public void main(String[] args) { SmartPhone smartPhone=PhoneFactory.createSmartPhone(MiPhone.class); smartPhone.startUp(); smartPhone.showBrand(); smartPhone.shutDown(); }
我们的智能手机就这样生产出来了!是不是很好的感觉?
以后别的手机友商,如果需要生产新的手机,就继承下,然后改下牌子名,就可以拿出去卖了,是不是很好!!!!!
另外如果要搞库存,保留模版,可以弄一个静态的存储!
这样初始化就能降低消耗了。
public static SmartPhone createSmartPhone(Class c) { SmartPhone phone = null; try { if (storePhone.containsKey(c.getSimpleName())) { phone = storePhone.get(c.getSimpleName()); } else { phone = (SmartPhone) Class.forName(c.getName()).newInstance(); storePhone.put(c.getSimpleName(), phone); } } catch (InstantiationException e) { System.out.println("必须指定手机牌子"); } catch (IllegalAccessException e) { System.out.println("手机定义错误"); } catch (ClassNotFoundException e) { System.out.println("没这牌子手机"); } return phone; } }
类图
我们看下我们的工厂方法的类图,是不是很灵活的样子!
我们只需要修改传递过去的手机类型,就可以开始生产手机了!
后记
写到这个钟头,都忘记好吃午饭了,写完突然觉得好饿啊。。前面的是简单定制的案例,不过现实可能会需要点复杂的,高度定制的手机,例如那个高逼格的某果手机。曾经为了加上蓝玻璃屏幕,找了一家供应商,别人知道了这事,他股票大涨,但这家供应商的工艺跟不上,没做出来他们需要的玻璃,结果股票大跌,倒闭了,哀伤的故事啊。
对于高度定制的工厂,我们也可以在原有的基础上加点修改,从而达到想要的效果的。
那是抽象工厂方法模型,下次写,欢迎关注。
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- PHP设计模式之装饰者模式代码实例
- php设计模式之单例模式实例分析
- 介绍php设计模式中的工厂模式
- PHP设计模式之适配器模式代码实例
- 深入浅出23种设计模式
- 浅谈c#设计模式之单一原则
- C#设计模式之观察者模式实例讲解
- C#设计模式之单例模式实例讲解
- 学习JavaScript设计模式(接口)
- 深入理解JavaScript系列(28):设计模式之工厂模式详解
- 面向对象设计模式的核心法则
- JavaScript设计模式之单件模式介绍
- 深入理解JavaScript系列(25):设计模式之单例模式详解