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 {

	@Override
	public Tiger createTiger() {		
		return new ZooTiger();
	}

	@Override
	public Lion createLion() {		
		return new ZooLion();
	}

	@Override
	public Monkey createMonkey() {		
		return new ZooMonkey();
	}

}

野生工厂:

复制代码
package com.thb;

public class WildFactory implements Factory {

	@Override
	public Tiger createTiger() {		
		return new WildTiger();
	}

	@Override
	public Lion createLion() {		
		return new WildLion();
	}

	@Override
	public Monkey createMonkey() {		
		return new WildMonkey();
	}

}
相关推荐
wuminyu6 分钟前
JVM规范学习总结:解释器与JIT编译器如何处理JVM字节码
java·linux·c语言·jvm·c++
txxzjmzlh16 分钟前
SpringBoot 配置⽂件
java·spring boot·spring
Wang's Blog44 分钟前
Java 项目实战: 交友项目 - 搜索附近的功能概述和分析
java·开发语言·交友
骑着蜗牛撵大象3271 小时前
大模型 Agent 的沙箱护栏:gVisor 隔离、出口白名单与审计闭环
java·开发语言·jvm·安全·agent沙箱·gvisor·microvm
独泪了无痕1 小时前
Hutool之LocalDateTimeUtil:让时间间隔操作如虎添翼
java
三无少女指南2 小时前
从这里开始:Java 后端与 AI 工程的三条阅读路线
java·学习路线·ai工程
香蕉大香蕉(06敬畏市场)3 小时前
MySQL 单点详解(07)
java·数据库·mysql·ai·博客·八股
nice_lcj5203 小时前
深入理解 Java 反射:从 Class 对象到方法调用(含性能实测 + 迷你 IOC 实战 + 面试考点)
java·开发语言·后端·面试
骑着蜗牛撵大象3274 小时前
2026 后端 AI 工程化:Spring AI 管调用、MCP 管工具、Agent 内嵌管自治
java·人工智能·后端·spring·ai·可观测性·mcp
tryxr4 小时前
JVM 垃圾回收机制
java·jvm·gc·垃圾回收