今天在网上看到了一篇关于工厂模式的文章,看起来很是简单易懂,就按作者的思路重新写了一遍加深对工厂模式的理解。作为低头一族的一员虎将,接下来我也用我们最常用的手机作为案例。做个例子,手机主要由电池、显示屏、手机主板、手机外壳组成。
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;
}
@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;
/**
* 描述:生产电池的概念
* 作者: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 电池产品
* */
@Override
public String crateBattery() {
// TODO Auto-generated method stub
return "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 显示屏产品
* */
@Override
public String createDisplay() {
// TODO Auto-generated method stub
return "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 手机主板产品
* */
@Override
public String createMatherBorad() {
// TODO Auto-generated method stub
return "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 手机外壳产品
* */
@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手机原料厂
* 作者:Linxz
* 邮箱:lin_xiao_zhang@163.com
* 时间: 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手机)
* 作者: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;
}
//把原材料的电池、显示屏、主板、外壳组装成一部有逼格的手机
@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;
/**
* 描述:
* 作者: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{
@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手机原料厂
* 作者:Linxz
* 邮箱:lin_xiao_zhang@163.com
* 时间: 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;
/**
* 描述:
* 作者: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的。好了,市场不等人啊,冲他一下子。这次可以充电五分钟通话两小时了。
注:本故事纯属虚构(改编)
原文出处