话说设计模式,简单工厂——一个人买手机的故事

话说简单工厂

前言

开始学习软件设计时,老是不懂为什么要用到工厂,因此有很多疑问。

1.为什么用到工厂模式?
2.自己写一个简单工厂,做出一个小作业,代码也没见少很多?
3.使用工厂模式方便的地方在哪里?

刚开始我不懂,直到和同学一起做老师布置的项目后,我好像发现了答案

1.我们是合作写代码,怎么分配写代码的任务?
2.当我们写好代码,代码怎么整合在一起,可以使我能调用他写的方法,让项目能运行?
3.怎么最快找到并修改我们写的bug?

为了让大家更容易理解我就用两个场景来描述这个问题

第一个场景:独自完成:一个人想要一部手机(自己想要手机,自己造手机,自己用手机)

第二个场景:合作完成:一个人想要一部手机(我想要一部手机,同学负责造手机,我用手机)

需求:一个人想要一部手机

场景一:独自完成

角色:客户(小张)、制造人(小张)

嗨,同学们好,我是小张!
昨天,我看到心心念念的iPhone 7手机有卖,内心极其激动。但想到自己只有两个肾,舍不
得这珍贵的肾,突然灵光一现,要不自己造个iPhone 7,不就省下一个肾啦。

我寻思着,怎么造这个iPhone 7 ?
众所周知,iPhone手机都有开机键,提供开机功能,诶,这样简单的手机设计图不久粗来了
吗!
经过我的一番骚操作,终于弄出来了iPhone 7 的设计图纸——iPhone7类,
//iPhone7设计图纸
public class IPhone7 {
    //iPhone7开机键
    public void start(){
        System.out.println("iPhone7正在开机中");
    }
}
好了既然有了手机,那就自己试一试造一个手机,开机试一试。。。

在这里插入图片描述

好高兴啊!我一按开机键,iPhone7正在开机中,我肾是激动,肾7手机能运行了,要不自己再造个iPhone8来耍耍。
看!我又设计一个iPhone8的设计图。。。。。。

//iPhone8设计图纸
public class IPhone8{
    //iPhone8开机键
    public void start(){
        System.out.println("iPhone 8 正在开机中");
    }
}

在这里插入图片描述
因此我们从这里发现了,如果我们需要再买一部新手机的流程

1.自己设计一个设计手机图纸(编写手机类)
2.自己造出一个手机(new 一个手机对象)
3.使用手机(调用手机方法)

所以在一个人独自写时,我们就得做所有的工作,项目简单还好,一旦项目大了,写出来可能会有点艰难。因此我们需要责任分工。

记住!我们以后是和别人合作完成任务的,一个人的精力是有限的,所以合作很重要,比如下面的小赵,他的能力就很有限

场景二:合作完成

角色:客户(小赵),工厂(小钱),设计师(小孙)

大家好,我是小赵,看到小张自己造了两个肾机,可馋死我了,嘿嘿,谁能料的到我不会造手
机吧,摊牌了,我只会按手机开机键!!
但我并不慌,但有人会造就行啦,这时我找来了富土康,我不会造手机,但我可以找会造手机
的人——小钱,他家开富土康的。

小钱厂长找了小孙设计师要来了两张手机设计图纸。
//iPhone7设计图纸
public class IPhone7 {
    //iPhone7开机键
    public void start(){
        System.out.println("iPhone7正在开机中");
    }
}
//iPhone8设计图纸
public class IPhone8{
    //iPhone8开机键
    public void start(){
        System.out.println("iPhone 8 正在开机中");
    }
}

看了这两个类,是不是很熟悉呀!
没错就是场景一小张做的,毕竟世界上只有唯一的iPhone7 设计图纸,富土康不可能拿了两张不同的图纸,造出两种不同的iPhone7

大家看到这里,是不是有点分工合作的味道啦,对我来说就是:拿来主义。管他怎么设计类,我拿来用就行

接下来看厂长小钱怎么使用这个设计图

小钱厂长看了两张设计图,很快啊,灵光一闪,不就是弄两个生产线就行啦
//富土康
public class Factory {
    //生产iPhone7来卖
    public static IPhone7 sellPhone7(){
        return new IPhone7();
    }
    //生产iPhone8来卖
    public static IPhone8 sellPhone8(){
        return new IPhone8();
    }
}

小钱厂长灰常感叹自己天才般的构思,接着就去找了小赵。

小钱:小赵啊,我厂里有手机卖了,你可以来拿手机啦,你可以去我门店买手机了
肾7地址Factory.sellPhone7()
肾8地址Factory.sellPhone8()

我很高兴,这么快就有手机的消息啦,赶紧按着小赵说的地址买了两部手机

在这里插入图片描述

有一天,小钱厂长觉得手机厂的店太多了
肾7地址Factory.sellPhone7()
肾8地址Factory.sellPhone8()
这不是让客户满地跑,去挑手机吗,这样客户体验不好,得改改流水线,发现设计图好像缺了点啥,流水线不好改,打电话一问原来是设计师没按国际公用的接口设计手机图纸,这不是与国际脱轨吗?
吓得小钱厂长赶紧找小孙改设计图

国际公用手机接口(每个手机都有开机功能)

public interface Phone {
    //手机开机键
    public void start();
}

重新修改后的手机设计图

//肾7设计图
public class IPhone7 implements Phone{
    @Override
    public void start() {
        System.out.println("iphone 7 正在开机中");
    }
}
//肾8设计图
public class IPhone8 implements Phone {
    @Override
    public void start() {
        System.out.println("iphone 8 正在开机中");
    }
}
看到这三张设计图纸,小钱厂长心里就有数了,更新了手机生产线
//富土康
public class Factory {
    //手机制造流水线
    public static Phone sellPhone(String phoneName) throws IllegalAccessException, InstantiationException {
        switch (phoneName) {
            case "IPhone7":
                return IPhone7.class.newInstance();
            case "IPhone8":
                return IPhone8.class.newInstance();
            default:
                //这手机没有图纸,造不出
                return null;
        }
    }
}
还是小钱我机智,及时发现问题,与国际接轨,省下一条生产线。设计图不按国际规定,等会
扣小孙工资!

客户买手机地址Factory.sellPhone(String phoneName)

在这里插入图片描述
好了从此简单的工厂的流水线就弄好了。
下面举个例子,让大家更好理解简单工厂怎么写

过了几天,正客户需要新型手机了,钱大厂长找了小孙按照客户新需求,在遵循国际惯例的情
况下,搞出来了iPhone9设计图
//肾9设计图
public class IPhone9 implements Phone {
    @Override
    public void start() {
        System.out.println("iphone 9 正在开机中");
    }
}
既然设计图有了,那就得让工厂能生产这种手机咯,
看看原工厂流水线
//富土康
public class Factory {
    //手机制造流水线
    public static Phone sellPhone(String phoneName) throws IllegalAccessException, InstantiationException {
        switch (phoneName) {
            case "IPhone7":
                return IPhone7.class.newInstance();
            case "IPhone8":
                return IPhone8.class.newInstance();
            default:
                //这手机没有图纸,造不出
                return null;
        }
    }
}
好像没有生产iPhone9的流程
得改改是不是?
哪里改呢?
//富土康
public class Factory {
    //手机制造流水线
    public static Phone sellPhone(String phoneName) throws IllegalAccessException, InstantiationException {
        switch (phoneName) {
            case "IPhone7":
                return IPhone7.class.newInstance();
            case "IPhone8":
                return IPhone8.class.newInstance();
            case "IPhone9":
                return IPhone9.class.newInstance();
            default:
                //这手机没有图纸,造不出
                return null;
        }
    }
}
在工厂加上
case "IPhone9":
            return IPhone9.class.newInstance();

不就造出来啦。是不是很简单!

在这里插入图片描述

 钱厂长的天才般的构想,使得他的手机厂可以迅速兼容生产世界上符合国际标准的手机啦。

从上面的例子可以总结一下简单工厂的添加新手机的步骤

	1.拿到新的实体类(新iPhone9的设计图)
	2.修改工厂代码
	3.客户调用工厂方法

是不是看出来了,作为客户什么麻烦事都不用做,只需要调用原来的工厂方法,传入一个手机名(IPhone9)作为参数,告诉工厂要给你什么手机就行了。
这是简单工厂不用修改的方面,也是开放的一面,不管工厂怎么修改,也不影响到外部调用者。这就是这个设计模式的好处。

但大家也要看到修改的一面,因为每次有新需求,就得重复1,2两个步骤。

新的实体类少了还好,一旦多了,就麻烦了。

 从此钱厂长天天晒太阳,喝下午茶,生活美滋滋。
 而作为客户的小赵是不是很轻松,哪里管工厂怎么造手机,直接拿来告诉他你要什么手机就行
 了。
 
 随着时代的发展,旧手机慢慢被淘汰了,厂里已经能生产iPhone1----iPhone99999的手机了
 钱厂长某天心血来潮去工厂视察了一下,妈耶!
 看到那么多老旧的设备在厂里占位置,最苦的是还不能拆了就设备,都是在同一条流水线上,
 老员工已经退休了,新员工又不敢乱动,随便碰,流水线准崩溃,这该咋办,地租电费这么
 贵,该咋办呀!

[链接:简单工厂的补充](可能用不了,私信我,我发给你)(https://download.csdn.net/download/weixin_46820226/13211480)

[简单工厂的例子源码](可能用不了,私信我,我发给你)(https://download.csdn.net/download/weixin_46820226/13211480)

下一篇:话说设计模式,工厂方法模式——一个工厂太多设备了,我开分厂!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值