今天在网上看到了一篇关于工厂模式的文章,看起来很是简单易懂,就按作者的思路重新写了一遍加深对工厂模式的理解。作为低头一族的一员虎将,接下来我也用我们最常用的手机作为案例。做个例子,手机主要由电池、显示屏、手机主板、手机外壳组成。

1.先定义手机实体,手机由电池、显示屏、主板、外壳组成

package com.factory;
/*** 描述:手机实体:手机由电池、显示屏、主板、外壳组成* 作者:Linxz* 邮箱:lin_xiao_zhang@163.com* 时间: 2017-3-25 下午12:30:28* 版本:1.0*/
public class Phone {private String battry;private String display;private String matherBorad;private String shell;public String getBattry() {return battry;}public void setBattry(String battry) {this.battry = battry;}public String getDisplay() {return display;}public void setDisplay(String display) {this.display = display;}public String getMatherBorad() {return matherBorad;}public void setMatherBorad(String matherBorad) {this.matherBorad = matherBorad;}public String getShell() {return shell;}public void setShell(String shell) {this.shell = shell;}@Overridepublic String toString() {return "Phone [battry=" + battry + ", display=" + display+ ", matherBorad=" + matherBorad + ", shell=" + shell+ ", getBattry()=" + getBattry() + ", getDisplay()="+ getDisplay() + ", getMatherBorad()=" + getMatherBorad()+ ", getShell()=" + getShell() + ", getClass()=" + getClass()+ ", hashCode()=" + hashCode() + ", toString()="+ super.toString() + "]";}
}

2.定义一个专门用来生产电池的接口

package com.factory;
/*** 描述:生产电池的概念* 作者:Linxz* 邮箱:lin_xiao_zhang@163.com* 时间: 2017-3-25 下午12:25:18* 版本:1.0*/
public interface IBattery {//生产电池public String crateBattery();
}

3.定义一个专门生产手机屏幕的接口

package com.factory;
/*** 描述:显示屏生产概念* 作者:Linxz* 邮箱:lin_xiao_zhang@163.com* 时间: 2017-3-25 下午12:27:04* 版本:1.0*/
public interface IDisplay {/**生产显示屏*/public String createDisplay();
}

4.定义一个专门生产手机主板的接口

package com.factory;
/*** 描述:手机主板生产概念* 作者:Linxz* 邮箱:lin_xiao_zhang@163.com* 时间: 2017-3-25 下午12:28:21* 版本:1.0*/
public interface IMatherBorad {/**生产手机主板*/public String createMatherBorad();
}

5.定义一个专门生产手机外壳的接口

package com.factory;
/*** 描述:手机壳生产概念* 作者:Linxz* 邮箱:lin_xiao_zhang@163.com* 时间: 2017-3-25 下午12:29:06* 版本:1.0*/
public interface IShell {/**生产手机外壳*/public String createShell();
}

6.定义一个获取手机电池、显示屏、主板、外壳的接口。我们生产手机的时候总要有原材料吧,要从各种零件的工厂中获取原材料啊。

package com.factory;
/*** 描述:手机原料工厂* 作者:Linxz* 邮箱:lin_xiao_zhang@163.com* 时间: 2017-3-25 下午12:32:16* 版本:1.0*/
public interface IFactory {/**电池*/public IBattery IcreateBattry();/**显示屏*/public IDisplay IcreateDisplay();/**主板*/public IMatherBorad IcreateMatherBorad();/**外壳*/public IShell IcreateShell();}

我们有了手机的各种零件的时候,要组装起来才能成为真正的手机。不然零件永远只是零件。(这让我想起了北朝鲜,研究核武器,研究远程导弹,研究卫星。日本为什么抵制朝鲜把卫星发射到外空,因为发射卫星跟核弹的原理是一样的,在火箭上放卫星那就是一个卫星设备,在火箭上放一颗核弹,那就是一个武器。朝鲜说是发射卫星,突然把卫星一换就呵呵哒了)。好了,言归正传我们需要一个组装手机的概念。

7.定义一个组装手机的接口

package com.factory;
/*** 描述:手机组装概念* 作者:Linxz* 邮箱:lin_xiao_zhang@163.com* 时间: 2017-3-25 下午12:34:57* 版本:1.0*/
public interface IAssemblyPlant {/**组装手机*/public Phone assemblyPlant();}

世界上都是先有了生产的概念,生产的技术,然后才会有专门生产这个产品的工具。上述声明的接口就相当于世界上出现了生产手机电池、显示屏、主板、外壳的概念了。至于用什么技术去生产,这就是生产工厂的事情了。
时间一天天过去,好了,我们终于有了生产电池、显示屏、主板、外壳这门技术了,然后我们纷纷建立工厂。这时候OPPO说,我也要制造手机,那好,手机需要什么零件我们就建什么工厂,就这样:OPPO电池工厂、OPPO显示屏工厂、OPPO主板工厂、OPPO外壳工厂建立起来了。

8.OPPO电池工厂(根据概念–>技术–>产品)

package com.factory;
/*** 描述:OPPO电池工厂* 作者:Linxz* 邮箱:lin_xiao_zhang@163.com* 时间: 2017-3-25 下午12:26:24* 版本:1.0*/
public class OPPOBattery implements IBattery{/*** 生产OPPO的电池* @return 电池产品* */@Overridepublic String crateBattery() {// TODO Auto-generated method stubreturn "OPPO手机电池";}}

9.OPPO显示屏工厂(概念–>技术–>产品)

package com.factory;
/*** 描述:OPPO显示屏工厂* 作者:Linxz* 邮箱:lin_xiao_zhang@163.com* 时间: 2017-3-25 下午12:27:44* 版本:1.0*/
public class OPPODisplay implements IDisplay{/*** 专门生产OPPO的显示屏* @return 显示屏产品* */@Overridepublic String createDisplay() {// TODO Auto-generated method stubreturn "OPPO手机显示屏";}}

10.OPPO主板工厂(概念–>技术–>产品)

package com.factory;
/*** 描述:OPPO手机主板* 作者:Linxz* 邮箱:lin_xiao_zhang@163.com* 时间: 2017-3-25 下午12:38:12* 版本:1.0*/
public class OPPOMatherBorad implements IMatherBorad{/*** 专门生产OPPO手机主板* @return 手机主板产品* */@Overridepublic String createMatherBorad() {// TODO Auto-generated method stubreturn "OPPO手机主板";}}

11.OPPO外壳工厂(概念–>技术–>产品)

package com.factory;
/*** 描述:OPPO手机壳工厂* 作者:Linxz* 邮箱:lin_xiao_zhang@163.com* 时间: 2017-3-25 下午12:29:36* 版本:1.0*/
public class OPPOShell implements IShell{/*** 专门生产OPPO外壳* @return 手机外壳产品* */@Overridepublic String createShell() {// TODO Auto-generated method stubreturn "OPPO手机外壳";}}

OPPO真是牛逼,上来就是干,几天就把电池厂、显示屏厂、主板厂、外壳厂建好并大规模生产了。市场不等人啊,各个工厂的零件出来了,得赶紧把这些零件收集起来,然后对零件进行组装。是的,市场不等人,赶紧件一个收集零件的工厂和一个组装零件的工厂吧。

12.建立搜集零件的工厂

package com.phone;import com.factory.IBattery;
import com.factory.IDisplay;
import com.factory.IFactory;
import com.factory.IMatherBorad;
import com.factory.IShell;
import com.factory.OPPOBattery;
import com.factory.OPPODisplay;
import com.factory.OPPOMatherBorad;
import com.factory.OPPOShell;/*** 描述:OPPO手机原料厂* 作者:Linxz* 邮箱:lin_xiao_zhang@163.com* 时间: 2017-3-25 下午12:36:29* 版本:1.0*/
public class OPPOFactory implements IFactory{/*** 作为一个有逼格的OPPO收集厂,我只要OPPO电池* @return OPPOBattery:OPPO电池* */@Overridepublic IBattery IcreateBattry() {// TODO Auto-generated method stubreturn new OPPOBattery();}/*** 作为一个有逼格的OPPO收集厂,我只要OPPO显示屏* @return OPPODisplay:OPPO显示屏* */@Overridepublic IDisplay IcreateDisplay() {// TODO Auto-generated method stubreturn new OPPODisplay();}/*** 作为一个有逼格的OPPO收集厂,我只要OPPO主板* @return OPPOMatherBorad:OPPO主板* */@Overridepublic IMatherBorad IcreateMatherBorad() {// TODO Auto-generated method stubreturn new OPPOMatherBorad();}/*** 作为一个有逼格的OPPO收集厂,我只要OPPO外壳* @return OPPOShell:OPPO外壳* */@Overridepublic IShell IcreateShell() {// TODO Auto-generated method stubreturn new OPPOShell();}}

13.建立一个OPPO组装工厂。默认(无参构造方法)情况下我们组装出来的是OPPO手机,但是为了业务需要,为了生活,我们也干点私活吧,咱有时间也组装几台其他的手机吧。(有参构造方法)

package com.phone;import com.factory.IAssemblyPlant;
import com.factory.IFactory;
import com.factory.Phone;/*** 描述:OPPO手机组装厂(OPPO手机组装厂组装出来的手机不一定就是OPPO手机)* 作者:Linxz* 邮箱:lin_xiao_zhang@163.com* 时间: 2017-3-25 下午12:39:21* 版本:1.0*/
public class OPPOAssemblyPlant implements IAssemblyPlant{private IFactory materisFactotry;//手机原料(任意类型的手机原料)//组装OPPO手机public OPPOAssemblyPlant(){this.materisFactotry=new OPPOFactory();}//OPPO手机装配厂干私活:组装其他类型手机(山寨)public OPPOAssemblyPlant(IFactory iFactory){this.materisFactotry=iFactory;}//把原材料的电池、显示屏、主板、外壳组装成一部有逼格的手机@Overridepublic Phone assemblyPlant() {// TODO Auto-generated method stubPhone phone=new Phone();phone.setBattry(materisFactotry.IcreateBattry().crateBattery());phone.setDisplay(materisFactotry.IcreateDisplay().createDisplay());phone.setMatherBorad(materisFactotry.IcreateMatherBorad().createMatherBorad());phone.setShell(materisFactotry.IcreateShell().createShell());return phone;}}

牛逼了我的哥,组装工厂能把组装出一部真正的手机了。等你直接使用new Phone()来生成一个手机的时候,牛逼如我可以用OPPOAssemblyPlant(组装工厂)的assemblyPlant()来组装出属于OPPO的手机了。

package com;import com.factory.Phone;
import com.phone.OPPOAssemblyPlant;/*** 描述:* 作者:Linxz* 邮箱:lin_xiao_zhang@163.com* 时间: 2017-3-25 下午12:24:56* 版本:1.0*/
public class Main {public static void main(String[] args) {OPPOAssemblyPlant oppoAssemblyPlant=new OPPOAssemblyPlant();Phone phone=oppoAssemblyPlant.assemblyPlant();System.out.println(phone);}}

生产结果如下:

就这样OPPO手机终于生产完成并投入市场了。半年过去了,市场上人人反馈这个OPPO手机充电两小时,通话五分钟。这就尴尬了。正好,市场上有一个公司建立了NOkia手机电池工厂,能充电五分钟,通话两小时。

14.市场上面的NOkia电池工厂

package com.factory;
/*** 描述:NOkia电池工厂,电量充足,正所谓:装逼用Nokia,装了还能再装* 作者:Linxz* 邮箱:lin_xiao_zhang@163.com* 时间: 2017-3-25 下午3:27:28* 版本:1.0*/
public class NOkiaBattery implements IBattery{@Overridepublic String crateBattery() {// TODO Auto-generated method stubreturn "NOkia电池";}}

这时候OPPO决定,我们OPPO2.0使用NOkia电池吧。然后董事长跟组装厂厂长说,你们装电池的时候装NOkia的吧。组装厂厂长:尼玛,关我鸟事,我tm装电池的时候才不看这个是OPPO的还是NOkia的,你还是跟OPPO原材料厂厂长说吧,让他搜集材料的时候把去买NOkia的电池吧。但是有一点,原材料厂别把电池的接口给我换了,不管OPPO的还是NOkia的,电池的接口都要一样。
就这样组装厂把这个皮球踢给了原材料厂,自己什么都没有改变,该吃的吃该喝的喝。

15.原材料厂搜集材料的时候把OPPO电池换成了NOkia电池

package com.phone;import com.factory.IBattery;
import com.factory.IDisplay;
import com.factory.IFactory;
import com.factory.IMatherBorad;
import com.factory.IShell;
import com.factory.NOkiaBattery;
import com.factory.OPPOBattery;
import com.factory.OPPODisplay;
import com.factory.OPPOMatherBorad;
import com.factory.OPPOShell;/*** 描述:OPPO手机原料厂* 作者:Linxz* 邮箱:lin_xiao_zhang@163.com* 时间: 2017-3-25 下午12:36:29* 版本:1.0*/
public class OPPOFactory implements IFactory{/*** 我要的是 NOkia电池* @return NOkiaBattery:NOkia电池* */@Overridepublic IBattery IcreateBattry() {// TODO Auto-generated method stubreturn new NOkiaBattery();}/*** 作为一个有逼格的OPPO收集厂,我只要OPPO显示屏* @return OPPODisplay:OPPO显示屏* */@Overridepublic IDisplay IcreateDisplay() {// TODO Auto-generated method stubreturn new OPPODisplay();}/*** 作为一个有逼格的OPPO收集厂,我只要OPPO主板* @return OPPOMatherBorad:OPPO主板* */@Overridepublic IMatherBorad IcreateMatherBorad() {// TODO Auto-generated method stubreturn new OPPOMatherBorad();}/*** 作为一个有逼格的OPPO收集厂,我只要OPPO外壳* @return OPPOShell:OPPO外壳* */@Overridepublic IShell IcreateShell() {// TODO Auto-generated method stubreturn new OPPOShell();}}

对比之前的OPPO原材料厂看看,我们的电池变量。

这次的变革中组装厂什么也没变,看看他们组装出来的手机是什么样的吧。

package com;import com.factory.Phone;
import com.phone.OPPOAssemblyPlant;/*** 描述:* 作者:Linxz* 邮箱:lin_xiao_zhang@163.com* 时间: 2017-3-25 下午12:24:56* 版本:1.0*/
public class Main {public static void main(String[] args) {OPPOAssemblyPlant oppoAssemblyPlant=new OPPOAssemblyPlant();Phone phone=oppoAssemblyPlant.assemblyPlant();System.out.println(phone);}}

结果如下:

董事会一看,还真tm邪门,组装厂还组装出来的OPPO手机的电池还真的是NOkia的。好了,市场不等人啊,冲他一下子。这次可以充电五分钟通话两小时了。

注:本故事纯属虚构(改编)
原文出处

设计模式--工厂模式(一个关于工厂的故事)相关推荐

  1. java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...

    23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...

  2. Java设计模式(工厂模式>抽象工厂模式和原型模式)

    Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...

  3. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  4. 设计模式之工厂模式和抽象工厂

    设计模式分类 通常来说设计模式分为三大类: 创建型模式,共 5 种:工厂模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共 7 种:适配器模式.装饰器模式.代理模式.外观模式.桥接模 ...

  5. 设计模式—工厂模式之简单工厂模式

    1. 简单工厂模式简介 简单工厂模式(Simple Factory),又被称为"静态工厂方法模式".它属于"创建模式"(创建对象的模式),并且是"工厂 ...

  6. 设计模式_1_工厂模式与抽象工厂

    工厂模式 工厂模式(创建型模式):创建对象接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建延伸到子类进行 主要解决接口选择问题,明确计划不同条件下执行创建不同实例 通过子类实现工厂实例,创建 ...

  7. getresourceasstream方法_【设计模式】第三篇:一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】...

    文章系列目录(持续更新中): [设计模式]第一篇:概述.耦合.UML.七大原则,详细分析总结(基于Java) [设计模式]第二篇:单例模式的几种实现And反射对其的破坏 一 为什么要用工厂模式 之前讲 ...

  8. 1小时搞懂设计模式之工厂模式(方法工厂)

    1 简单工厂缺点 以及方法工厂实现逻辑 通过我的上一篇博客 工厂模式之简单工厂 我们了解了什么是简单工厂.我们可以通过创建钢工厂类对象来获取不同类型的钢对象.但是如果我们每次新增加一种类型的钢,我们需 ...

  9. 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)...

    转自:http://www.cnblogs.com/stonehat/archive/2012/04/16/2451891.html 设计模式系列--三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂 ...

  10. java工厂模式和抽象工厂_Java中的抽象工厂设计模式

    java工厂模式和抽象工厂 Welcome to Abstract Factory Design Pattern in java example. Abstract Factory design pa ...

最新文章

  1. iOS 一行命令发布 Pod 框架
  2. 二项式反演[bzoj3622]已经没有什么好害怕的了
  3. SQL中group by的用法
  4. android录音播放列表,android数据库里的视频,图片,音频表
  5. android实践练习_android 练习之路 (四)
  6. 【网易云课堂---轻松读书:番茄工作法】
  7. vba手机号码归属_Android中手机号码归属地查询实现
  8. 【JSP】 # JSP入门及简单概述
  9. 医学激光成像仪行业研究及十四五规划分析报告
  10. 微信小程序-历史搜索记录保存与清空
  11. webstack开源网站导航源码
  12. PCIe EA (Enhanced Allocation) 介绍
  13. 虚拟机中试用windows 8(视频)
  14. 为Windows Live Writer写一个简单的插件
  15. 库存管理中的 (s, S) 策略,K convex,K 凸
  16. Prettier的使用
  17. Filecoin主网上线只是鸣枪开跑,完美落地需要成长的过程
  18. 微软面试题:站在地球上的某一点,向南走一公里,然后向东走一公里,最后向北走一公里,回到了原点。地球上有多少个满足这样条件的点?
  19. 一种低成本的兰吉尔电表电量采集方案
  20. 第十九天:初识Linux+系统与设置命令+目录管理

热门文章

  1. oracle 查看用户配额,【Quota】获取及调整用户表空间配额方法
  2. cursor游标讲解
  3. 小技巧2:Python 实现阿拉伯数字转化为中文数字
  4. php英文数字转为中文,利用PHP怎么将英文数字转换为阿拉伯数字
  5. RuntimeWarning: divide by zero encountered in log错误解决
  6. 为什么企业要招应届生?
  7. Rmarkdown 报错:无法打开链接
  8. 大专生从零开始重新学习c#的第八天
  9. 再见2020,你好2021:往事不回头,万事皆可期!
  10. 网易云音乐修改名字怎么老是服务器错误,网易云音乐为什么改了名字?网抑云是怎么回事...