【设计模式】抽象工厂模式 ( 简介 | 适用场景 | 优缺点 | 产品等级结构和产品族 | 代码示例 )

news/2024/11/24 11:42:31/

文章目录

  • 一、抽象工厂模式简介
  • 二、抽象工厂模式适用场景
  • 三、抽象工厂模式优缺点
  • 四、产品等级结构和产品族
  • 五、抽象工厂模式代码示例
    • 1、冰箱抽象类
    • 2、美的冰箱实现类
    • 3、格力冰箱实现类
    • 4、空调抽象类
    • 5、美的空调实现类
    • 6、格力空调实现类
    • 7、工厂抽象接口 ( 重点 )
    • 8、美的工厂实现类 ( 重点 )
    • 9、格力工厂实现类 ( 重点 )
    • 10、测试类





一、抽象工厂模式简介



抽象工厂模式 : 提供 一个 创建 一系列 相关 或 相互依赖 对象 的接口 ;

创建目标对象时 , 只需要直到对象的抽象类型或接口类型即可 , 不需要知道具体的实现类型 ;

抽象工厂模式类型 : 创建型 ;


抽象工厂模式 可以将 一组具有同一主题 , 单独的工厂 封装起来 ;
在使用时 , 客户端 创建 抽象工厂 的实现 , 使用 抽象工厂 作为接口 , 来创建这一主题的对象 ;
使用的时候 , 不需要知道 从内部 工厂方法中获得的 对象 的具体类型 ;
客户端 只 使用这些对象的 通用接口 ;

抽象工厂模式 实现了 一组对象的 实现细节使用 分离 ;





二、抽象工厂模式适用场景



抽象工厂模式适用场景 :

  • 忽略创建细节 : 客户端 不关心 产品实例 如何 被创建 , 实现等细节 ;
  • 创建产品族 : 强调 一系列 相关的 产品对象 , 一般是 同一个产品族 , 一起使用 创建对象需要大量重复的代码 ;
  • 产品类库 : 提供 一个 产品类 的库 , 所有的产品 以 同样的接口出现 , 使 客户端不依赖于具体实现 ;

使用抽象工厂模式 , 可以在工厂变化时 , 不需要修改 客户端 使用工厂的 代码 ;





三、抽象工厂模式优缺点



抽象工厂模式优点 :

  • 隔离产品代码 :应用层 隔离 具体产品的代码 , 客户端 无须关心 产品创建 的细节 ;
  • 创建产品族 :一个系列 的 产品族 , 统一到一起创建 ;

抽象工厂模式缺点 :

  • 扩展困难 : 规定了 所有 可能 被创建 产品集合 , 产品族扩展 新的产品 困难 , 需要 修改抽象工厂的接口 ;
  • 增加难度 : 增加了系统的 抽象性理解难度 ;




四、产品等级结构和产品族



下图中 , 有 椭圆形 , 圆形 , 正方形 , 三种产品 ;

  • 产品族 : 相同颜色的代表一个产品族 ;
  • 产品等级结构 : 相同形状的代表同一个产品等级结构 ;

在这里插入图片描述

如 : 方型 - 洗衣机 , 圆形 - 空调 , 椭圆 - 冰箱 ;

  • 横向 看 产品族 : 某 品牌下 有 方型 - 洗衣机 , 圆形 - 空调 , 椭圆 - 冰箱 , 这是一个产品族 ;
  • 纵向看产品等级结构 : 椭圆 - 冰箱 , 纵向指的是不同品牌的冰箱 ;

工厂方法模式 针对的是 产品等级结构 , 可以 扩展多个相同的产品 ;

抽象工厂模式 针对的是 产品族 , 在 某个品牌 的工厂中取出 洗衣机 类 , 取出的肯定是 该品牌的洗衣机实例对象 ;

只要指出 产品所在的 产品族 以及 产品所在的 产品等级结构 , 就可以唯一确定一个产品 ;


左侧的 纵坐标轴 上的 工厂 是 具体的工厂 , 从该具体的工厂中 创建的实例该产品族中的实例 ;

在这里插入图片描述


使用 工厂模式 还是 抽象工厂模式 , 要看具体的业务场景 ;
当一个工厂 可以 创建 分属于 不同 产品等级结构一个 产品族 中的 不同对象时 , 使用 抽象工厂模式 ;

如 :

  • 工厂 中可以创建 相同品牌的 洗衣机 , 冰箱 , 空调 等产品 , 使用 抽象工厂模式 ;
  • 如果 工厂中创建 不同品牌的空调 , 则使用 工厂方法模式 ;




五、抽象工厂模式代码示例



如果要新增 产品族 , 只需要增加 产品族工厂 , 对应的产品类 即可 ;
如果要新增 产品等级 , 很麻烦 , 需要修改所有的产品族工厂 , 这就违背了开闭原则 ;

产品等级结构固定 , 需要多个产品组合在一起形成产品族的 业务场景 , 适合使用抽象工厂模式 ;


业务场景 : 有两个电器品牌 , 美的 和 格力 ; 每个品牌下都有 冰箱 和 空调 产品 ;


1、冰箱抽象类


package abstractfactory;/*** 冰箱抽象类*/
public abstract class Fridge {public abstract void produce();
}

2、美的冰箱实现类


package abstractfactory;/*** 美的冰箱*/
public class MideaFridge extends Fridge {@Overridepublic void produce() {System.out.println("生产美的冰箱");}
}

3、格力冰箱实现类


package abstractfactory;/*** 格力冰箱*/
public class GreeFridge extends Fridge {@Overridepublic void produce() {System.out.println("生产格力冰箱");}
}

4、空调抽象类


package abstractfactory;/*** 空调抽象类*/
public abstract class AirConditioner {public abstract void produce();
}

5、美的空调实现类


package abstractfactory;/*** 美的空调*/
public class MideaAirConditioner extends AirConditioner {@Overridepublic void produce() {System.out.println("生产美的空调");}
}

6、格力空调实现类


package abstractfactory;/*** 格力空调*/
public class GreeAirConditioner extends AirConditioner {@Overridepublic void produce() {System.out.println("生产格力空调");}
}

7、工厂抽象接口 ( 重点 )


package abstractfactory;/*** 抽象工厂方法*/
public interface Factory {/*** 生产冰箱* @return*/Fridge getFridge();/*** 生产空调* @return*/AirConditioner getAirConditioner();
}

8、美的工厂实现类 ( 重点 )


package abstractfactory;/*** 美的工厂*/
public class MideaFactory implements Factory {@Overridepublic Fridge getFridge() {return new MideaFridge();}@Overridepublic AirConditioner getAirConditioner() {return new MideaAirConditioner();}
}

9、格力工厂实现类 ( 重点 )


package abstractfactory;/*** 格力抽象工厂*/
public class GreeFactory implements Factory {@Overridepublic Fridge getFridge() {return new GreeFridge();}@Overridepublic AirConditioner getAirConditioner() {return new GreeAirConditioner();}
}

10、测试类


package abstractfactory;public class Main {public static void main(String[] args) {// 生产 美的 品牌的 冰箱 和 空调Factory mideaFactory = new MideaFactory();// 美的冰箱Fridge mideaFridge = mideaFactory.getFridge();mideaFridge.produce();// 美的空调AirConditioner mideaAirConditioner = mideaFactory.getAirConditioner();mideaAirConditioner.produce();System.out.println();// 生产 格力 品牌的 冰箱 和 空调Factory greeFactory = new GreeFactory();// 格力冰箱Fridge greeFridge = greeFactory.getFridge();greeFridge.produce();// 格力空调AirConditioner greeFridgeAirConditioner = greeFactory.getAirConditioner();greeFridgeAirConditioner.produce();}
}

执行结果 :

生产美的冰箱
生产美的空调生产格力冰箱
生产格力空调

在这里插入图片描述


http://www.ppmy.cn/news/773092.html

相关文章

颜色代码(详)

颜色代码: 颜色代码:红色#FF0000 深紫色 #871F78 褐红色 #8E236B 石英色 #D9D9F3 绿色#00FF00 深石板蓝 #6B238E 中海蓝色 #32CD99 艳蓝色 #5959AB 蓝色#0000FF 深铅灰色 #2F4F4F 中蓝色 #3232CD 鲑鱼色 #6F4242 牡丹红 #FF00FF 深棕褐色 #97694F 中森林绿 #6B8E23 猩红色 #BC1…

从视频源头到边缘智能:实现端到端AI解决方案的技术挑战与实践

从视频源头到边缘智能:实现端到端AI解决方案的技术挑战与实践 引言端到端AI解决方案打通视频源头采集视频传输和存储边缘计算和盒子设备 SDK示列 引言 随着人工智能技术的快速发展,端到端AI解决方案在各个领域的应用越来越广泛。这些解决方案能够实现从…

Vivado2020.1 vitis使用:创建hello world项目

前言 之前网上的教程都是基于Vivado2018的,后来接手一个未完工的项目,是使用Vivado2020.1创建的,非常尴尬,只能打开,不能编辑。千辛万苦把2020.1安装好,当然此时不仅仅是Vivado2020.1了,而是vi…

【PCIE】协议分析之-hot-reset热复位

被上游指定热复位整个通路 当高层(higher Layer)指示某些通道进行热复位(Hot Reset)时,以下操作将被执行: 所有在配置的链路中的通道都会发送带有热复位位(Hot Reset bit)和配置的…

【设计模式】第六章:装饰器模式详解及应用案例

系列文章 【设计模式】七大设计原则 【设计模式】第一章:单例模式 【设计模式】第二章:工厂模式 【设计模式】第三章:建造者模式 【设计模式】第四章:原型模式 【设计模式】第五章:适配器模式 【设计模式】第六章&…

macos可以升级到指定版本吗_如何升级mac系统版本?

展开全部 老版本mac如何升级系统,如果你的电脑是Mac的话,首先需要准备两636f70793231313335323631343130323136353331333431363533个工具:iOS13的固件和MobileDevice。在Mac上把MobileDevice安装好,把对应机型的iOS13固件包下载。…

iPhone升级系统 死机了怎么办

不少人升级系统结果遇到了死机、不能进入正常界面、白苹果的情况吧? 遇到这种问题,你可以这样解决: 白苹果 同时按下“电源键”和“Home键”,直到屏幕黑屏。屏幕黑屏时松开“电源键,继续按住“Home键”不放&#xf…

低版本MAC如何升级系统

1.进入苹果官网 2.点击技术支持 3.下面两个任意搜索其中一个进行升级会自动连接到APP Store 可完成低版本系统下载 ht206886 ht208202 4.下载完成后按步骤点击安装即可