工厂模式--手机工厂的例子

来源:互联网 发布: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的。好了,市场不等人啊,冲他一下子。这次可以充电五分钟通话两小时了。
注:本故事纯属虚构(改编)

原创粉丝点击