❓首先什么是设计模式?
😵相信刚上大学的你和我一样,在学习这门课的时候根本不了解这些设计原则和模式有什么用处,反而不如隔壁的C++更有意思,至少还能弹出一个小黑框,给我个hello world。
✨ 如何你和我一样也是这么想,那接下来咱们以贴合生活实际 的方式来看看设计模式 到底有什么神奇的地方?
😄更多有趣的设计模式讲解都在设计模式👍专栏,欢迎来看看🎉🎉🎉。
【设计模式】工厂方法模式
前言
在前面的博客中我们已经简单介绍了什么是简单工厂模式,需要详细了解的可以看一下这个博客 》【设计模式】简单工厂模式《
另外,简单总结一下简单工厂,其实就是将复杂的创建对象的流程封装到一个类中,我们称之为工厂,然后由该工厂实现对象的创建,从而将对象创建和对象使用分割开来。
但是,简单工厂是有它的局限性的。当需要创建新一类 对象时,我们需要修改原来的工厂类(注意,这里不是创建新对象,是需要创建新一类对象,就比如原来可以创造A类对象,现在需要创造B类对象,就必须要修改工厂类)。
那有什么办法可以解决吗,没错,就是我们的工厂方法模式。
工厂方法模式
现在总结下我们的需求
- 可以动态增加创建对象的类别
- 不需要修改原工厂类
这时候你有没有什么解决方法?
是不是有一个很简单的方式,就是直接再创建一个工厂类就好了嘛,然后使用该工厂来创建新类别的对象
这个路子是不是很简单,感觉非常合理,但是否真的合理呢?
六大原则分析
我们从六大原则入手开始考虑
首先是开闭原则 ,没毛病,支持添加新工厂类和对象类,而且还没修改原来的代码。
那里氏代换呢
好像有点问题了,没有父类呀,这俩工厂类并没有关系(当然硬说的话都是object的子类,暂不考虑这个,因为覆盖面太广了,实际操作没有太大意义)。
那想一下,为什么要满足里氏代换呢,也就是父类可以直接引用子类,然后直接使用子类的功能呢?
试想一下这样的功能哈
现在我们有一个造宝马的工厂,工厂类和产品定义如下所示
java
class BMWProduct {
}
class BMWFactory{
public Product create() {
return new BMWProduct();
}
}
这个时候,我们需要通知这个工厂去造车,然后再进行后续的一些工作,如下所示
java
void test() {
// 创建工厂
BMWFactory factory = new BMWFactory();
// 造车
Product car = factory.create();
// 刷漆,贴膜和加配等操作,这里就不写了,就是对car进行美化,或调用car的方法
}
现在需求来了,我们不仅需要通知BMW工厂造车,我们还需要通知XM工厂去造车,如果现在这种代码逻辑的话,我们是不是需要再去写一边test方法,因为你不能保证XM车能调用的方法和BMW车能调用的方法一致
这个时候,你会发现,你又多写了一遍test方法
但如果使用工厂方法呢
java
abstract class Product {
}
interface Factory {
Product create();
}
class BMWProduct extends Product {
}
class BMWFactory implements Factory {
@Override
public Product create() {
return null;
}
}
void test() {
// 创建工厂
Factory factory = new BMWFactory();
// 造车
Product car = factory.create();
// 刷漆,贴膜和加配等操作
}
你会发现,我们使用Factory来接受具体的造车工厂,这样我们如果需要XM工厂造车的话,我们只需要把test中的BMWFactory换成XMFactory就可以了,如下
java
void test() {
// 创建工厂
Factory factory = new XMFactory();
// 造车
Product car = factory.create();
// 刷漆,贴膜和加配等操作
}
这样效率是不是就上来了
现实工作中的应用
如果你现在需要创建多个对象,并且多个对象的具体实现并不相同,基于创建的对象还要执行相同的操作,可以采用该模式,这样可以保证你后期维护时,只需要添加工厂对象和产品对象,并不需要修改原有的逻辑,以免出现问题。
并且很适合给新手进行扩展
如果我们提供的方法没有很好的扩展性,新手可能需要对原逻辑代码进行修改,出错概率极高。
采用这种方式可以避免很多问题的发生。
问题
观察上面的方法,你会发现很好解决了造多种车的需求
但如果现在我需要车厂造车的时候,顺便把车膜也给我整出来,那咋弄呢
我们现在的方法,一个工厂只能造一类产品,肯定不行
那有没有解决方案呢?
也就是我们之后要讲的抽象工厂模式
总结
先写到这里,抽象工厂很快更新