李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 左邻右舍
  • 博友圈
  • 关于我
    • 关于我
    • 另一个网站
    • 我的导航站
    • 网站地图
    • 赞助
  • 留言
  • 走心评论
  • 系列文章
  • Now
  • 每日心情
  • 🚇开往
Destiny
自是人生长恨水长东
  1. 首页
  2. 后端
  3. 正文

JAVA设计模式-抽象工厂模式

2020年2月18日 约 1,095 字4 分钟 26点热度 0人点赞 0条评论
合集:Java设计模式第 4 篇 / 共 8 篇
Java›Java设计模式
  1. 1Java设计模式:状态模式
  2. 2Java设计模式:策略模式
  3. 3Java设计模式:模板方法模式
  4. 4JAVA设计模式-抽象工厂模式当前
  5. 5JAVA设计模式-工厂方法模式
  6. 6Java设计模式-原型模式
  7. 7Java设计模式-单例模式
  8. 8设计模式总结

定义

抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。

抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。

适用场景

使用抽象工厂模式一般要满足以下条件:

  1. 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
  2. 系统一次只可能消费其中某一族产品,即同族的产品一起使用。

优缺点

抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下:

  1. 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
  2. 当增加一个新的产品族时不需要修改原代码,满足开闭原则。

其缺点是:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。

结构与实现

抽象工厂模式同工厂方法模式一样,也是由抽象工厂、具体工厂、抽象产品和具体产品等4个要素构成,但抽象工厂中方法个数不同,抽象产品的个数也不同。

结构

抽象工厂模式的主要角色如下:

  1. 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
  2. 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
  3. 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
  4. 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间是多对一的关系。

自动草稿

package com.lifengdi.designpatterns.demo.abstractfactory;

/**
 * 抽象工厂
 * 抽象工厂(AbstractFactory)模式的定义:
 * 是一种为访问类提供一个创建一组相关或相互依赖对象的接口,
 * 且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
 *
 * 抽象工厂模式是工厂方法模式的升级版本,
 * 工厂方法模式只生产一个等级的产品,
 * 而抽象工厂模式可生产多个等级的产品。
 *
 * 抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下:
 * 1. 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
 * 2. 当增加一个新的产品族时不需要修改原代码,满足开闭原则。
 *
 * 其缺点是:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。
 * @author 李锋镝
 * @date Create at 16:14 2019/12/16
 */
public interface AbstractFactory {

    Product1 newProduct1();

    Product2 newProduct2();
}

package com.lifengdi.designpatterns.demo.abstractfactory;

/**
 * @author 李锋镝
 * @date Create at 16:15 2019/12/16
 */
public interface Product1 {
    void show();
}

package com.lifengdi.designpatterns.demo.abstractfactory;

/**
 * @author 李锋镝
 * @date Create at 16:15 2019/12/16
 */
public interface Product2 {
    void show();
}

package com.lifengdi.designpatterns.demo.abstractfactory;

/**
 * @author 李锋镝
 * @date Create at 16:17 2019/12/16
 */
public class AbstractFactory1Impl implements AbstractFactory {
    @Override
    public Product1 newProduct1() {
        return () -> System.out.println("AbstractFactory1Impl newProduct1");
    }

    @Override
    public Product2 newProduct2() {
        return () -> System.out.println("AbstractFactory1Impl newProduct2");
    }
}

package com.lifengdi.designpatterns.demo.abstractfactory;

/**
 * @author 李锋镝
 * @date Create at 16:17 2019/12/16
 */
public class AbstractFactory2Impl implements AbstractFactory {
    @Override
    public Product1 newProduct1() {
        return () -> System.out.println("AbstractFactory2Impl newProduct1");
    }

    @Override
    public Product2 newProduct2() {
        return () -> System.out.println("AbstractFactory2Impl newProduct2");
    }
}

package com.lifengdi.designpatterns.demo.abstractfactory;

/**
 * @author 李锋镝
 * @date Create at 16:23 2019/12/16
 */
public class AbstractFactoryTest {
    public static void main(String[] args) {
        AbstractFactory abstractFactory1 = new AbstractFactory1Impl();
        abstractFactory1.newProduct1().show();
        abstractFactory1.newProduct2().show();

        AbstractFactory abstractFactory2 = new AbstractFactory2Impl();
        abstractFactory2.newProduct1().show();
        abstractFactory2.newProduct2().show();
    }
}
除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/hou-duan/1689

推荐阅读

  • Java设计模式:状态模式
  • Java设计模式:策略模式
  • Java设计模式:模板方法模式
  • JAVA设计模式-工厂方法模式
  • Java设计模式-原型模式
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: JAVA 抽象工厂模式 设计模式
最后更新:2026年7月14日

岁月同一天 8 月 10 日

回望过去的今天,你在写什么

  • 4 年前 2022年8月10日
    Linux开启FTP

    1、安装 vsftpd sudo yum install -y vsftpd 2、设置 vsftpd 开机自启动 sud…

相关文章
  • Eclipse反编译插件Jad安装2019年9月27日
  • 我要狠狠的反驳“公司禁止使用 Lombok ”的观点!2021年3月3日
  • 配置Jackson使用字段而不是getter/setter来序列化和反序列化2026年3月19日
  • 何谓重构?为何重构?2019年6月24日
  • 以面试官视角万字解读线程池10大经典面试题2025年5月14日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 合集上一篇
合集下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复
…

文章评论

还没有评论,快来抢沙发吧~

生命中所有的灿烂,终要用寂寞偿还。

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
Kratos+ v1.1.14版本更新说明 Spring Boot 指定外部配置文件的方式 Spring Boot 配置加载优先级总结 Claude Fable 5(claude-fable-5)深度详解 如何通过命令查看Java应用内存中对象数量 关于服务的探活端口和业务端口不一致有什么问题
给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能AI时代,个人技术博客的出路在哪里?增加了两套复古皮肤-牛皮纸、千禧网页这个域名注册整整十年了,十年时间,真快啊WordPress实现用户评论等级排行榜插件WordPress网站换了个字体,差点儿把样式换崩了
内存屏障浅析 深入了解PostgreSQL TestNG基本注解 缓存架构实战指南:6大核心缓存技术深度解析与落地方案 Tomcat7.0配置CORS(跨域资源共享) 使用AbstractRoutingDataSource动态切换数据源
最近评论
Hary 发布于 11 小时前(08月09日) 我都想用了,但是是ty,转换有点麻烦
老张博客 发布于 2 天前(08月08日) 做的越来越精美了,好看。
Huo 发布于 2 天前(08月07日) 挺有特色的主题,还是感觉 WP 的确是强大
李锋镝 发布于 3 天前(08月07日) 没理解你想说啥
aboss 发布于 3 天前(08月07日) 你的后台web-login?
标签聚合
Claude AI WordPress 架构 SpringBoot AI编程 docker Spring 日常 ElasticSearch IDEA JVM 多线程 SQL MySQL JAVA 分布式 Redis K8s 数据库
友情链接
  • 老张博客
  • Mr.Sun的博客
  • 知向前端
  • 瓦匠个人小站
  • 皮皮社
  • 林羽凡
  • 志文工作室
  • 旧时繁华
  • 韩情脉脉
  • 拾趣博客导航
  • 临窗旋墨
  • 懋和道人
  • 哥斯拉
  • Honesty
  • Blogs·CN
  • 韩小韩博客
  • 搬砖日记
  • 风渡言
  • 彬红茶日记

COPYRIGHT © 2026 lifengdi.com. ALL RIGHTS RESERVED.

正在博友圈履约中

域名年龄

Theme Kratos+ By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号