话说简单工厂
前言
开始学习软件设计时,老是不懂为什么要用到工厂,因此有很多疑问。
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)