❓首先什么是设计模式?
😵相信刚上大学的你和我一样,在学习这门课的时候根本不了解这些设计原则和模式有什么用处,反而不如隔壁的C++更有意思,至少还能弹出一个小黑框,给我个hello world。
✨ 如何你和我一样也是这么想,那接下来咱们以贴合生活实际的方式来看看设计模式到底有什么神奇的地方?
😄更多有趣的设计模式讲解都在设计模式👍专栏,欢迎来看看🎉🎉🎉。
【设计模式】工厂模式
- 前言
- 简单工厂模式
- 优势
- 问题
- 总结
前言
接下来咱们就开始讲解各种设计模式了。不同于之前我们聊的六大原则,这些设计模式直接给我们了模板,在实际应用的时候可以直接套用这些模板。
但是在了解的过程中你会发现,可能有些设计模式增加了代码量,可是我们的目的不是为了提升开发效率吗?
这里先给出答案,我们所谓的提升开发效率并不会体现到最初的架构设计中,相反,使用设计模式会使得我们的开发时间增加。
但是,如果后期我们需要更新或则添加新功能的时候,设计模式的优势就体现出来了,那具体是怎么提升效率的,我们一起来看看吧。
简单工厂模式
我们先不讲什么是简单工厂模式,我们先从实际业务聊一聊,看看为什么会出现简单工厂模式。
首先先从生活角度讲起哈,给定一个场景,如下
我们开了一家汽车店,这家汽车店一方面需要组装汽车,另一方面需要卖汽车。我们的工作流程就是
组装汽车 ==》卖汽车
随着订单数量的上升,我们在组装汽车的时候还要考虑怎么去讨好消费者,从而卖掉汽车。
这无疑让我们有了许多的烦恼,但是后来我突然发现,既然我一个人干起来太费劲了,我可不可以找另一个人帮我分担些工作呢?
于是,我就想到了是不是可以组装汽车这个工作外包给其他人,那我就不需要考虑造汽车的过程了,我只需要找外包工厂要汽车,然后想方设法讨好消费者就好了。这样确实可以帮助我们省去了造车的烦恼。
但上述的过程如果应用到代码实现有什么好处吗?或者换句话说,简单工厂模式的意义在哪?
我们用伪代码来看一下
没有工厂模式的时候
public void all() {System.out.println("复杂的造车过程");System.out.println("想办法卖掉这辆车");}
all就是造车和卖车的整个过程。可以看到我们的方法里的功能太过冗余了,既要造车又要卖车,这和咱们之前提到的单一原则完全不吻合。
另外我们如果需要修改造车的具体实现,我们需要十分小心,因为我们的修改可能会影响到卖车的流程。 用咱们的话来说,这是啥,就是二者的耦合度太高了。
那使用工厂模式之后呢
汽车工厂
public class CarFactory {// 工厂类返回生产好的汽车对象public Car getBYD() {System.out.println("复杂的制造过程");return new BYD();}
}
public void sellCar() {CarFactory carFactory = new CarFactory();Car car = carFactory.getBYD();System.out.println("想办法卖掉这辆车");}
此时你就会发现,我们的sellcar里并不需要考虑如何造车,只需要调用工厂类的方法就可获取到车,然后专心卖车就好了。即使以后造车过程有变动,我们也是直接修改CarFactory,并不需要修改sellcar这个方法。
优势
看完上面的流程,相信我们大概清楚了简单工厂模式是什么,接下来我们总结一下他的优势。
降低耦合度
这个还是比较好理解的,如上文所述,我们把造车和卖车分开了,造车使用工厂模式。这个好处就是我们售卖方法并不需要知道造车的具体流程,这样就不至于出现我们修改售卖流程,不小心把造车过程也给修改了的问题。
封装创建对象的细节
我们直接把造车的过程封装到了工厂类中,这样以后的开发人员并不需要知道造车的细节,直接使用即可。 可以帮助之后的工作人员快速上手。
问题
如上所述,我们已经大体了解了简单工厂模式,但现在有一个问题,我们现在联系的造车厂只能生产A车,但我们现在扩大规模了,想让工厂也生产B车。
但是工厂告诉我们,如果要生产B车,需要重建整个生产线,这样才能提供B车。
那就很麻烦了,这怎么解决呢?
我们找一个单独的工厂他很难提供给我们多种类型的车,但如果我们找一个集团呢?
这个集团下面有各种各样工厂,可以帮助我们生产各式各样的车,别说A、B车了,CDEF都行,那我们要怎么去找这个集团呢?
这些内容就是后面我们要讲的抽象工厂的内容了!
总结
先写到这里,抽象工厂模式很快更新!