李锋镝的博客

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

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

2020年2月18日 329点热度 0人点赞 0条评论

定义

抽象工厂(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

相关文章

  • 6个高频设计模式深度解析(附完整案例与避坑指南)
  • Java设计模式:状态模式
  • Java设计模式:策略模式
  • Java设计模式:模板方法模式
  • JAVA设计模式-工厂方法模式
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: JAVA 抽象工厂模式 设计模式
最后更新:2025年11月20日

李锋镝

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

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

文章评论

秋天是倒放的春天,晚安是爱你的序篇。

那年今日(07月03日)

  • 2005年:西班牙正式通过同性婚姻相关法案
  • 1969年:英国滚石乐队的创始团员布莱恩·琼斯去世
  • 1876年:中国第一条铁路淞沪铁路正式通车运营
  • 1518年:中国明代医学家兼药物学家李时珍出生
  • 1062年:中国北宋官员包拯去世
  • 更多历史事件
最新 热点 随机
最新 热点 随机
Kratos+主题新功能预览及功能演示 SpringBoot DeferredLog 完整详解 LiteLLM 本地代理搭建 Claude-HUD 使用文档 Kratos+ —— Kratos 主题二次开发记录 译文:如何将单体应用拆解为微服务
AI时代,个人技术博客的出路在哪里?这个域名注册整整十年了,十年时间,真快啊WordPress实现用户评论等级排行榜插件WordPress网站换了个字体,差点儿把样式换崩了做了一个WordPress文章热力图插件千万级大表新增字段实战指南:告别锁表与业务中断
Auld Lang Syne 缓存架构实战指南:6大核心缓存技术深度解析与落地方案 阿里巴巴的26款超神Java开源项目 Claude Code全维度实战指南:从入门到精通,解锁AI编程新范式 岁末 海琴烟~~~
最近评论
李锋镝 发布于 4 天前(06月30日) 目前是每天一换,一个星期不重样 :41:
不凡 发布于 4 天前(06月29日) 主题配色挺好看。 :2:
李锋镝 发布于 5 天前(06月29日) 已经更新了~
懋和道人 发布于 5 天前(06月29日) 境外与附件不能访问,其他都是正常的,如果不正常可以通过更换ip访问。
李锋镝 发布于 5 天前(06月29日) 403呀道长
标签聚合
SQL 多线程 日常 IDEA 数据库 ElasticSearch Spring AI编程 JVM JAVA SpringBoot MCP 分布式 MySQL docker AI 架构 K8s Redis WordPress
友情链接
  • Blogs·CN
  • Honesty
  • Mr.Sun的博客
  • 临窗旋墨
  • 哥斯拉
  • 彬红茶日记
  • 志文工作室
  • 懋和道人
  • 拾趣博客导航
  • 搬砖日记
  • 旧时繁华
  • 林羽凡
  • 瓦匠个人小站
  • 皮皮社
  • 知向前端
  • 蜗牛工作室
  • 韩小韩博客
  • 风渡言

COPYRIGHT © 2026 lifengdi.com. ALL RIGHTS RESERVED.

域名年龄

Theme Kratos+ By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号