Spring常用设计模式--抽象工厂模式
阿里云国际版折扣https://www.yundadi.com |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
本专栏内容参考自咕泡学院Tom老师的《Spring5核心原理与30个类手写实战》仅作个人学习记录使用如有侵权联系速删。
抽象工厂模式是指提供一个创建一系列相关或相互依赖对象的接口无需指定他们的具体类。客户端应用层不依赖于产品实体类如何被创建、如何被实现等细节强调的是一系列相关的产品对象属于同一产品族一起使用创建对象需要大量重复的代码。需要提供一个产品类的库所有的产品以同样的接口出现从而使客户端不依赖于具体实现。
看抽象工厂模式之前我们要了解两个概念产品等级结构和产品族。
如上图一句话解释一行是一个产品族一列是一个产品等级列表结构同一族的产品是出自同一个工厂的
通过上图大概能了解一下产品等级结构和产品族还是以代码举例吧
第一期简单工厂第二期工厂方法
学校有了第三期优化每个课程不仅要提供课程的录播视频还要提供课堂笔记甚至还要有源码才能构成一个完整的课程。在产品等级中新增两个产品IVideo录播视频和INode课堂笔记接口。
public interface IVideo {
void record();
}
public interface INote {
void edit();
}
然后创建一个抽象工厂类CourseFactory
/**
* 抽象工厂是用户的主入口
* 是Spring中应用最广泛的一种设计模式
* 易于扩展
*/
public interface CourseFactory {
INote createNote();
IVideo createViedo();
}
接下来创建Java产品族的Java视频类JavaVideo
public class JavaVideo implements IVideo{
@Override
public void record() {
System.out.println("录制Java视频");
}
}
扩展产品等级Java课堂笔记类JavaNote
public class JavaNote implements INote{
@Override
public void edit() {
System.out.println("编写Java笔记");
}
}
创建Java产品族的工厂JavaCourseFactory
public class JavaCourseFactory implements CourseFactory{
@Override
public INote createNote() {
return new JavaNote();
}
@Override
public IVideo createViedo() {
return new JavaVideo();
}
}
然后创建Python产品的Python视频类PythonVideo
public class PythonVideo implements IVideo{
@Override
public void record() {
System.out.println("录制python视频");
}
}
扩展产品等级Python课堂笔记类PythonNote
public class PythonNote implements INote{
@Override
public void edit() {
System.out.println("编写python笔记");
}
}
然后创建Python产品族的具体工厂PythonCourseFactory
public class PythonCourseFaactory implements CourseFactory{
@Override
public INote createNote() {
return new PythonNote();
}
@Override
public IVideo createViedo() {
return new PythonVideo();
}
}
来看客户端调用
public class Main {
public static void main(String[] args) {
JavaCourseFactory factory = new JavaCourseFactory();
factory.createNote().edit();
factory.createViedo().record();
PythonCourseFaactory factory2 = new PythonCourseFaactory();
factory2.createNote().edit();
factory2.createViedo().record();
}
}
是不是有那么一丝丝感觉了上面的代码完整的描述了两个产品族Java和python课程也描述了两个产品恩济视频和笔记。抽象工厂模式完美且清晰的描述了这样一层复杂的关系但是如果我们再继续扩展产品等级呢将源码也加入课程那么我们的代码从抽象工厂到具体工厂全部都要调整但很显然不符合开闭原则。所以抽象工厂模式也是有缺点的
1规定了所有可能被创建的产品集合产品族中扩展新的产品困难需要修改抽象工厂的接口。
2增加了系统的抽象性和理解难度。
但在实际应用中我们千万不能“犯强迫症”甚至有洁癖。实际需求中产品等级结构升级是一件非常正常的事情。只要不频繁的升级根据实际情况可以不遵循开闭原则。代码每半年或者一年升级一次有何不可