李锋镝的博客 - LiFengdi.Com

  • 首页
  • 时间轴
  • 留言
  • 左邻右舍
  • 我的日常
  • 关于我
青衿之志 履践致远
霁月光风 不萦于怀
  1. 首页
  2. 原创
  3. 正文

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

2020年2月18日 13999点热度 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();
    }
}
除非注明,否则均为李锋镝的博客 - LiFengdi.Com原创文章,转载必须以链接形式标明本文链接
本文链接:https://www.lifengdi.com/archives/article/1689
本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: JAVA 抽象工厂模式 设计模式
最后更新:2020年2月18日

李锋镝

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

打赏 点赞
< 上一篇
下一篇 >
guest
您的姓名(必填)
您的邮箱(必填)
您的站点
guest
您的姓名(必填)
您的邮箱(必填)
您的站点
0 评论
Inline Feedbacks
查看所有评论
支付宝红包

花褪残红青杏小,燕子飞时,绿水人家绕。枝上柳绵吹又少,天涯何处无芳草。
墙里秋千墙外道,墙外行人,墙里佳人笑。笑渐不闻声渐悄,多情却被无情恼。

最新 热点 随机
最新 热点 随机
回忆是一条没有尽头的路 这样的日子什么时候才是个头 MySQL 中的 distinct 和 group by 哪个效率更高? 开工啦~ 今晚,回家过年! 图数据库选型:Neo4j、Janus、HugeGraph
看病难~取药难~~阳了...开工啦~RocketMQ的push消费方式实现详解国庆节过的也很累~~MybatisCodeHelperPro激活
多层嵌套map对象转扁平化map 九种常用的UML图总结 Excel2016右键新建工作表,打开时提示“因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。”的解决办法 网站升级到http/2 全网最全Shiro认证与授权原理分析 TestNG基本注解
最近评论
李锋镝 发布于 2 周前(03月10日) 已添加~欢迎回访喔
博客录(boke.lu) 发布于 2 周前(03月10日) 已添加贵站0.0 名称:博客录(boke.lu) 简介:boke.lu · 博客收录展示平台~ 链接...
李锋镝 发布于 3 周前(03月05日) 系统版本是win11吗?
HJQ 发布于 4 周前(02月28日) 同问,注册表都没有楼主说的值。
林羽凡 发布于 1 个月前(02月16日) 开工大吉。
有情链接
  • 志文工作室
  • 临窗旋墨
  • 旧时繁华
  • 城南旧事
  • 强仔博客
  • 林三随笔
  • 徐艺扬的博客
  • 云辰博客
  • 韩小韩博客
  • 知向前端
  • 阿誉的博客
  • 林羽凡
  • 情侣头像
  • 哥斯拉
  • 博客录

COPYRIGHT © 2022 lifengdi.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

豫ICP备16004681号-2