工厂模式--手机工厂的例子
来源:互联网 发布:js 让input变成必填 编辑:程序博客网 时间:2024/04/30 08:58
今天在网上看到了一篇关于工厂模式的文章,看起来很是简单易懂,就按作者的思路重新写了一遍加深对工厂模式的理解。作为低头一族的一员虎将,接下来我也用我们最常用的手机作为案例。做个例子,手机主要由电池、显示屏、手机主板、手机外壳组成。
1.先定义手机实体,手机由电池、显示屏、主板、外壳组成:
package com.factory;/** * 描述:手机实体:手机由电池、显示屏、主板、外壳组成 * 作者:zyb * 时间: 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; } @Override public 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;/** * 描述:生产电池的概念 * 作者:zyb * 时间: 2017-3-25 下午12:25:18 * 版本:1.0 */public interface IBattery { //生产电池 public String crateBattery();}
3.定义一个专门生产手机屏幕的接口:
package com.factory;/** * 描述:显示屏生产概念 * 作者:zyb * 时间: 2017-3-25 下午12:27:04 * 版本:1.0 */public interface IDisplay { /**生产显示屏*/ public String createDisplay();}
4.定义一个专门生产手机主板的接口
package com.factory;/** * 描述:手机主板生产概念 * 作者:zyb * 时间: 2017-3-25 下午12:28:21 * 版本:1.0 */public interface IMatherBorad { /**生产手机主板*/ public String createMatherBorad();}
5.定义一个专门生产手机外壳的接口:
package com.factory;/** * 描述:手机壳生产概念 * 作者:zyb * 时间: 2017-3-25 下午12:29:06 * 版本:1.0 */public interface IShell { /**生产手机外壳*/ public String createShell();}
6.定义一个获取手机电池、显示屏、主板、外壳的接口。我们生产手机的时候总要有原材料吧,要从各种零件的工厂中获取原材料啊。
package com.factory;/** * 描述:手机原料工厂 * 作者:zyb * 时间: 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;/** * 描述:手机组装概念 * 作者:zyb * 时间: 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电池工厂 * 作者:zyb * 时间: 2017-3-25 下午12:26:24 * 版本:1.0 */public class OPPOBattery implements IBattery{ /** * 生产OPPO的电池 * @return 电池产品 * */ @Override public String crateBattery() { // TODO Auto-generated method stub return "OPPO手机电池"; }}
9.OPPO显示屏工厂(概念–>技术–>产品):
package com.factory;/** * 描述:OPPO显示屏工厂 * 作者:zyb * 时间: 2017-3-25 下午12:27:44 * 版本:1.0 */public class OPPODisplay implements IDisplay{ /** * 专门生产OPPO的显示屏 * @return 显示屏产品 * */ @Override public String createDisplay() { // TODO Auto-generated method stub return "OPPO手机显示屏"; }}
10.OPPO主板工厂(概念–>技术–>产品):
package com.factory;/** * 描述:OPPO手机主板 * 作者:zyb * 时间: 2017-3-25 下午12:38:12 * 版本:1.0 */public class OPPOMatherBorad implements IMatherBorad{ /** * 专门生产OPPO手机主板 * @return 手机主板产品 * */ @Override public String createMatherBorad() { // TODO Auto-generated method stub return "OPPO手机主板"; }}
11.OPPO外壳工厂(概念–>技术–>产品):
package com.factory;/** * 描述:OPPO手机壳工厂 * 作者:zyb * 时间: 2017-3-25 下午12:29:36 * 版本:1.0 */public class OPPOShell implements IShell{ /** * 专门生产OPPO外壳 * @return 手机外壳产品 * */ @Override public String createShell() { // TODO Auto-generated method stub return "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手机原料厂 * 作者:zyb * 时间: 2017-3-25 下午12:36:29 * 版本:1.0 */public class OPPOFactory implements IFactory{ /** * 作为一个有逼格的OPPO收集厂,我只要OPPO电池 * @return OPPOBattery:OPPO电池 * */ @Override public IBattery IcreateBattry() { // TODO Auto-generated method stub return new OPPOBattery(); } /** * 作为一个有逼格的OPPO收集厂,我只要OPPO显示屏 * @return OPPODisplay:OPPO显示屏 * */ @Override public IDisplay IcreateDisplay() { // TODO Auto-generated method stub return new OPPODisplay(); } /** * 作为一个有逼格的OPPO收集厂,我只要OPPO主板 * @return OPPOMatherBorad:OPPO主板 * */ @Override public IMatherBorad IcreateMatherBorad() { // TODO Auto-generated method stub return new OPPOMatherBorad(); } /** * 作为一个有逼格的OPPO收集厂,我只要OPPO外壳 * @return OPPOShell:OPPO外壳 * */ @Override public IShell IcreateShell() { // TODO Auto-generated method stub return new OPPOShell(); }}
13.建立一个OPPO组装工厂。默认(无参构造方法)情况下我们组装出来的是OPPO手机,但是为了业务需要,为了生活,我们也干点私活吧,咱有时间也组装几台其他的手机吧。(有参构造方法):
package com.phone;import com.factory.IAssemblyPlant;import com.factory.IFactory;import com.factory.Phone;/** * 描述:OPPO手机组装厂(OPPO手机组装厂组装出来的手机不一定就是OPPO手机) * 作者:zyb * 时间: 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; } //把原材料的电池、显示屏、主板、外壳组装成一部有逼格的手机 @Override public Phone assemblyPlant() { // TODO Auto-generated method stub Phone 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;/** * 描述: * 作者:zyb * 时间: 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,装了还能再装 * 作者:zyb * 时间: 2017-3-25 下午3:27:28 * 版本:1.0 */public class NOkiaBattery implements IBattery{ @Override public String crateBattery() { // TODO Auto-generated method stub return "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手机原料厂 * 作者:zyb * 时间: 2017-3-25 下午12:36:29 * 版本:1.0 */public class OPPOFactory implements IFactory{ /** * 我要的是 NOkia电池 * @return NOkiaBattery:NOkia电池 * */ @Override public IBattery IcreateBattry() { // TODO Auto-generated method stub return new NOkiaBattery(); } /** * 作为一个有逼格的OPPO收集厂,我只要OPPO显示屏 * @return OPPODisplay:OPPO显示屏 * */ @Override public IDisplay IcreateDisplay() { // TODO Auto-generated method stub return new OPPODisplay(); } /** * 作为一个有逼格的OPPO收集厂,我只要OPPO主板 * @return OPPOMatherBorad:OPPO主板 * */ @Override public IMatherBorad IcreateMatherBorad() { // TODO Auto-generated method stub return new OPPOMatherBorad(); } /** * 作为一个有逼格的OPPO收集厂,我只要OPPO外壳 * @return OPPOShell:OPPO外壳 * */ @Override public IShell IcreateShell() { // TODO Auto-generated method stub return new OPPOShell(); }}
对比之前的OPPO原材料厂看看,我们的电池变量。
这次的变革中组装厂什么也没变,看看他们组装出来的手机是什么样的吧。
package com;import com.factory.Phone;import com.phone.OPPOAssemblyPlant;/** * 描述: * 作者:zyb * 时间: 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的。好了,市场不等人啊,冲他一下子。这次可以充电五分钟通话两小时了。
注:本故事纯属虚构(改编)
- 工厂模式--手机工厂的例子
- 另一个工厂模式的例子
- Java的工厂模式例子
- 工厂方法模式的例子
- 工厂模式的简单例子
- 简单工厂模式和工厂模式的实现例子
- 简单工厂模式例子
- 工厂模式例子
- 工厂方法模式(例子)
- java va中工厂模式( 静态工厂模式、工厂方法模式、抽象工厂模式)的介绍以及简单例子
- 简单工厂模式、工厂模式和抽象工厂模式例子
- C++实现工厂模式的例子
- 仅仅一个工厂设计模式的例子
- 工厂模式例子之计算器的实现
- 简单工厂模式的java实现例子
- 工厂方法模式的java实现例子
- 工厂模式的生产披萨例子
- 工厂方法模式的java实现例子
- svn代码提交不了的问题
- mongoDB之数据库操作
- 为什么要使用Java反射机制?
- cmd显示'python' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
- iOS开发设置Xcode控制台显示中文
- 工厂模式--手机工厂的例子
- 最简 jrtplib 收发数据实例——非常详细简洁
- p2p webrtc服务器搭建系列1: 房间,信令,coturn打洞服务器
- 设计模式之门面模式
- CRC校验码
- FTP 编写 2:客户端与服务端的连接
- 深度学习之OCR(四)——Attention机制_soft attention
- php文章内容内链功能,相同关键字只内链一次
- 请求转发和重定向的区别