当前位置: 首页 > news >正文

Java设计模式-抽象工厂(Abstract Factory)模式

说明

抽象工厂(Abstract Factory)模式是一种工厂模式。用一个接口类中的不同方法创建不同的产品。

为了便于理解,先打个比方:

将老虎、狮子、猴子比作三个抽象产品的接口类,也就是有3个产品等级。
老虎又分动物园的老虎、野生的老虎 — 比作具体产品
狮子又分动物园的狮子、野生的狮子 — 比作具体产品
猴子又分动物园的猴子、猴子的猴子 — 比作具体产品

动物园的动物比作一个产品族,野生的动物比作另外一个产品族,共2个产品族。

抽象工厂模式就是用一个接口中的三个方法分别创建老虎、狮子、猴子。
具体工厂实现抽象工厂,对应有两个具体工厂:动物园具体工厂、野生具体工厂。
动物园具体工厂生产动物园老虎、动物园狮子、动物园猴子。
野生具体工厂生产野生老虎、野生狮子、野生猴子。

概况起来说:

  • 有两个产品族:动物园的动物、野生动物。
  • 每个产品族中有三个产品等级:老虎、狮子、猴子。

抽象工厂模式涉及如下角色:

  • 抽象工厂(Abstract Factory)角色:它一般是一个接口类或者一个抽象类。其中声明了生产一族产品的所有方法。产品族中有几个产品等级就有几个方法。与具体的业务逻辑无关。
  • 具体工厂类(Concrete Factory):实现抽象工厂的方法。有几个产品族就有几个具体工厂类。客户端直接调用具体工厂类创建具体的产品。与具体的业务逻辑有关。
  • 抽象产品(Abstract Product)角色:一般是一个接口或者抽象类,是具体产品的父类。具体产品要实现抽象产品。
  • 具体产品(Concrete Product)角色:实现抽象产品,是客户端最终需要的产品。

代码示例

以上面打的比方来举例。

定义抽象产品

老虎接口:

package com.thb;public interface Tiger {}

狮子接口:

package com.thb;public interface Lion {}

猴子接口:

package com.thb;public interface Monkey {}

定义具体产品

动物园老虎:

package com.thb;public class ZooTiger implements Tiger {}

动物园狮子:

package com.thb;public class ZooLion implements Lion {}

动物园猴子:

package com.thb;public class ZooMonkey implements Monkey {}

野生老虎:

package com.thb;public class WildTiger implements Tiger {}

野生狮子:

package com.thb;public class WildLion implements Lion {}

野生猴子:

package com.thb;public class WildMonkey implements Monkey {}

定义抽象工厂

package com.thb;public interface Factory {Tiger createTiger();Lion createLion();Monkey createMonkey();
}

定义具体工厂

动物园工厂:

package com.thb;public class ZooFactory implements Factory {@Overridepublic Tiger createTiger() {		return new ZooTiger();}@Overridepublic Lion createLion() {		return new ZooLion();}@Overridepublic Monkey createMonkey() {		return new ZooMonkey();}}

野生工厂:

package com.thb;public class WildFactory implements Factory {@Overridepublic Tiger createTiger() {		return new WildTiger();}@Overridepublic Lion createLion() {		return new WildLion();}@Overridepublic Monkey createMonkey() {		return new WildMonkey();}}
http://www.lryc.cn/news/121629.html

相关文章:

  • Hive加密,PostgreSQL解密还原
  • 2023年测试岗,接口测试面试题汇总+答案,拿捏面试官...
  • C# --- Case Study
  • 3.1 Spring MVC概述
  • Towards Open World Object Detection【论文解析】
  • IP协议
  • 使用sqlplus连接oracle,提示ORA-01034和ORA-27101
  • TLS协议
  • Academic Inquiry|国外文献查找
  • opencv图片灰度二值化
  • 短肥网络的 RTT 敏感性
  • Nonebot实战之编写插件1
  • Linux-C++开发项目:基于主从Reactor模式的高性能并发服务器
  • 【Linux的开胃小菜】Linux系统安装后初始化配置操作
  • Java批量下载书籍图片并保存为PDF的方法
  • flutter 创建lib
  • 深度剖析堆栈指针
  • C++笔记之静态成员函数的使用场景
  • Nginx的优化和防盗链
  • 第二十次CCF计算机软件能力认证
  • 一篇文章带你了解Java发送邮件:使用JavaMail API发送电子邮件的注意事项、发送附件等
  • kubernetes的日志
  • 设计HTML5文本
  • msvcr120.dll丢失怎样修复?总结三个dll修复方法
  • 选择题方法论——颉斌斌
  • 23.8.8 杭电暑期多校7部分题解
  • 《24海南大学835软件工程考研经验贴》
  • 【yolo系列:运行报错AttributeError: module ‘torch.nn‘ has no attribute ‘Mish‘】
  • Leetcode 剑指 Offer II 039. 直方图最大矩形面积
  • SpringBoot案例-部门管理-修改