前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring常用设计模式--抽象工厂模式

Spring常用设计模式--抽象工厂模式

作者头像
向着百万年薪努力的小赵
发布2022-12-02 10:23:35
5040
发布2022-12-02 10:23:35
举报
文章被收录于专栏:小赵的Java学习

本专栏内容参考自:咕泡学院Tom老师的《Spring5核心原理与30个类手写实战》,仅作个人学习记录使用,如有侵权,联系速删。

  抽象工厂模式是指提供一个创建一系列相关或相互依赖对象的接口,无需指定他们的具体类。客户端(应用层)不依赖于产品实体类如何被创建、如何被实现等细节,强调的是一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码。需要提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。   看抽象工厂模式之前,我们要了解两个概念:产品等级结构和产品族。

在这里插入图片描述
在这里插入图片描述

如上图,一句话解释:一行是一个产品族,一列是一个产品等级(列表)结构,同一族的产品是出自同一个工厂的 通过上图大概能了解一下产品等级结构和产品族,还是以代码举例吧: 第一期简单工厂第二期工厂方法 学校有了第三期优化:每个课程不仅要提供课程的录播视频,还要提供课堂笔记,甚至还要有源码才能构成一个完整的课程。在产品等级中新增两个产品:IVideo录播视频和INode课堂笔记接口。

代码语言:javascript
复制
public interface IVideo {
    void record();
}
代码语言:javascript
复制
public interface INote {
    void edit();
}

然后创建一个抽象工厂类CourseFactory:

代码语言:javascript
复制
/**
 * 抽象工厂是用户的主入口
 * 是Spring中应用最广泛的一种设计模式
 * 易于扩展
 */
public interface CourseFactory {
    INote createNote();
    IVideo createViedo();
}

接下来,创建Java产品族的Java视频类JavaVideo:

代码语言:javascript
复制
public class JavaVideo implements IVideo{
    @Override
    public void record() {
        System.out.println("录制Java视频");
    }
}

扩展产品等级Java课堂笔记类JavaNote:

代码语言:javascript
复制
public class JavaNote implements INote{
    @Override
    public void edit() {
        System.out.println("编写Java笔记");
    }
}

创建Java产品族的工厂JavaCourseFactory:

代码语言:javascript
复制
public class JavaCourseFactory implements CourseFactory{
    @Override
    public INote createNote() {
        return new JavaNote();
    }

    @Override
    public IVideo createViedo() {
        return new JavaVideo();
    }
}

然后创建Python产品的Python视频类PythonVideo:

代码语言:javascript
复制
public class PythonVideo implements IVideo{
    @Override
    public void record() {
        System.out.println("录制python视频");
    }
}

扩展产品等级Python课堂笔记类PythonNote:

代码语言:javascript
复制
public class PythonNote implements INote{
    @Override
    public void edit() {
        System.out.println("编写python笔记");
    }
}

然后创建Python产品族的具体工厂PythonCourseFactory:

代码语言:javascript
复制
public class PythonCourseFaactory implements CourseFactory{
    @Override
    public INote createNote() {
        return new PythonNote();
    }

    @Override
    public IVideo createViedo() {
        return new PythonVideo();
    }
}

来看客户端调用:

代码语言:javascript
复制
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)增加了系统的抽象性和理解难度。 但在实际应用中,我们千万不能“犯强迫症”甚至有洁癖。实际需求中,产品等级结构升级是一件非常正常的事情。只要不频繁的升级,根据实际情况可以不遵循开闭原则。代码每半年或者一年升级一次有何不可?

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档