java常用设计模式-工厂方法模式原创
之前介绍了简单工厂模式,我们也认识到简单模式的缺点其实也很明显,工厂类的职责相对过重,不易于扩展过于复杂的产品结构。所以我们现在来介绍一下工厂方法模式。工厂方法模式是指定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法模式其宗旨其实就是将类的实例化推迟到子类中进行。在工厂方法模式中用户只需要关心所需产品对应的工厂,无需关心创建细节。
接下来我们还是拿酒厂的例子来做代码演示。
首先我们来定义酒厂总接口,如下:
/**
* @Author: mao ba
* @Description: 造酒厂
* @Date: 2020-07-12 16:30
*/
public interface WineFactory {
//创建造酒厂
IDistillery create();
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
上述接口显然是一个创建对象的接口,具体思路是这样的,不同的品种酒厂实现该接口之后,可以各自创建自己的对象,并且可以调用造酒的方法,说白了就是子制造厂有能力自己创建自己的产品。看一下子制造厂的实现方式。
//白酒制造厂
public class WhiteWineFactory implements WineFactory{
public IDistillery create() {
return new WhiteWineDistillery();
}
}
1
2
3
4
5
6
2
3
4
5
6
//黄酒制造厂
public class YellowWineFactory implements WineFactory{
public IDistillery create() {
return new YelloWineDistillery();
}
}
1
2
3
4
5
6
2
3
4
5
6
这样,我们就实现了具体创建对象延迟到子类中实现。
看一下其调用方式:
public class WineFactoryMain {
public static void main(String[] args) {
//酿造白酒
WineFactory wineFactory = new WhiteWineFactory();
wineFactory.create().makeWine();
//酿造黄酒
WineFactory yellowWinFactory = new YellowWineFactory();
yellowWinFactory.create().makeWine();
}
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
这样的话,我们的子类将更加地灵活。
我们来总结一下工厂方法模式适用场景:
- 创建对象需要大量重复代码
- 客户端(应用层)不依赖于产品类实例如何被创建、如何被实现等细节。
- 一个类通过子类来指定创建哪个对象,则变得更加灵活。
当然上述都是优点,我们来看下缺点:
- 类的个数容易过多,增加复杂度。
- 增加了系统的抽象性以及理解难度。
参考书籍: 《spring 5核心原理》
上次更新: 2022/11/30, 00:06:25