李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 每日心情
  • Now
  • 系列文章
  • AI工具集
  • 论坛
  • 左邻右舍
    • 左邻右舍
    • 朋友圈
    • 游客中心
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于本站
    • 网站地图
    • 网站统计
    • 另一个网站
    • 赞助
  • 星球穿梭
  • 🚇开往
白雪成红
惟坚韧者始能遂其志
  1. 首页
  2. 后端
  3. 正文

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

2020年2月18日 约 1,095 字4 分钟 178 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();
    }
}
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
分享到

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

也可使用浏览器菜单中的「分享」功能

微信扫一扫分享

标签: JAVA 抽象工厂模式 设计模式
最后更新:2026年7月14日
相关文章
  • JAVA之从线程安全说到锁2019年10月12日
  • Hibernate、MyBatis的简介、区别以及优化2019年8月20日
  • 动态线程池框架DynamicTp使用以及架构设计2025年4月29日
  • Aeron详解2026年8月13日
  • 分布式ID生成算法SnowFlake(雪花算法)Java源码2019年7月5日

李锋镝

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

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

文章评论

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

黄沙百战穿金甲,不破楼兰终不还。

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
Kratos-plus v1.1.26版本更新说明 我觉得是时候公布我的导航网站了 代码是 AI 写的,生产事故谁背锅? 给主题增加了游客中心功能 祝大家中秋安康 游本昌去世
给主题增加了游客中心功能游本昌去世关于主题加载速度优化的一点儿小演进我觉得是时候公布我的导航网站了给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能WordPress缓存插件WP Fastest Cache、WP Rocket 、FlyingPress对比
精通Linux根目录:核心文件夹深度解析与实战指南 优化了MYSQL大量写入问题,老板奖励了1000块给我 MySQL分页排序时数据重复问题(MySQL优先队列) MySQL 的自增 ID 用完了,怎么办? Gemini 3 Pro 深度测评:多模态AI编程的跨代际突破,从一句话到完整应用的全链路革命 给主题增加了游客中心功能
最近评论
fairy 发布于 1 天前(10月02日) 很明显,只能处罚人,当然是人背锅。你能罚AI钱吗?能把AI辞退吗?很明显不能。
彬红茶 发布于 1 天前(10月02日) 很全面哦~国庆快乐
彬红茶 发布于 1 天前(10月01日) 确实可以加一下这个功能,我最近就改了,评论区加了个等级,游客中心实属无能为力 :78:
皮皮社长 发布于 2 天前(10月01日) 快看快看,我皮皮社长上榜了~ :2:
皮皮社长 发布于 2 天前(10月01日) 我直接把喜欢的网站放到友链中就好了,简单明了~ :40:
标签聚合
JAVA SQL 分布式 架构 JVM 日常 AI编程 多线程 IDEA K8s Spring WordPress MySQL Claude AI 数据库 ElasticSearch Redis SpringBoot Theme
友情链接
  • Serendipity
  • 林羽凡
  • Honesty
  • 蜗牛工作室
  • 若梦博客
  • 韩情脉脉
  • 九仞之行
  • 哥斯拉
  • 老张博客
  • 韩小韩博客
  • lijie blog
  • 皮皮社
  • 彬红茶日记
  • 懋和道人
  • 知向前端
  • 临窗旋墨
  • 搬砖日记
  • sssr7844的博客
  • 志文工作室
  • 瓦匠个人小站

COPYRIGHT © 2016-2026 lifengdi.com. ALL RIGHTS RESERVED.

lifengdi.com

Domain age badge for lifengdi.com

Theme Kratos-plus By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号