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

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

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的。好了,市场不等人啊,冲他一下子。这次可以充电五分钟通话两小时了。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值