三、抽象工厂模式

  • 目的 :提供一个接口,用于创建相关或依赖对象的家族,而不需要指定它们的具体类。
  • 核心 :抽象工厂接口声明一组创建方法,每个具体工厂实现这些方法以创建属于同一"家族"或"主题"的一组产品。
  • 场景 :在图形界面设计中,可以使用抽象工厂模式来创建不同操作系统的窗口、按钮等组件。

首先有若干个产品接口

java 复制代码
public interface IProduct1 {
	void show();
}
java 复制代码
public interface IProduct2 {
	void show();
}

然后有具体的产品类实现这些接口

java 复制代码
public class Product1 implements IProduct1 {
	@Override
	public void show() {
		System.out.println("产品1");
	}
}
java 复制代码
public class Product1 implements IProduct2 {
	@Override
	public void show() {
		System.out.println("产品2");
	}
}

接着有若干子类继承这些产品类

java 复制代码
public class GradeProduct1A extends Product1 {
	@Override
	public void show() {
		super.show();		// 可以调用父类的方法
		System.out.println("产品1的型号A");
	}
}
java 复制代码
public class GradeProduct1B extends Product1 {
	@Override
	public void show() {
		super.show();		// 可以调用父类的方法
		System.out.println("产品1的型号B");
	}
}
java 复制代码
public class GradeProduct1A extends Product2 {
	@Override
	public void show() {
		super.show();		// 可以调用父类的方法
		System.out.println("产品2的型号A");
	}
}
java 复制代码
public class GradeProduct1B extends Product2 {
	@Override
	public void show() {
		super.show();		// 可以调用父类的方法
		System.out.println("产品2的型号B");
	}
}

核心来了,声明一个工厂接口,并在里面声明创建上面若干子类实例的方法

java 复制代码
public interface IFactory {
	public IProduct1 createProduct1A();
	public IProduct1 createProduct1B();
	public IProduct2 createProduct2A();
	public IProduct2 createProduct2B();
}

最后用工厂类实现工厂接口

java 复制代码
public class Factory implements IFactory {

	@Override
	public IProduct1 createProduct1A() {
		return new GradeProduct1A();
	}

	@Override
	public IProduct1 createProduct1B() {
		return new GradeProduct1B();
	}

	@Override
	public IProduct2 createProduct2A() {
		return new GradeProduct2A();
	}

	@Override
	public IProduct2 createProduct2B() {
		return new GradeProduct2B();
	}
}

在主函数调用

java 复制代码
public class MainTest {
	public static void main(String[] args) {
		IFactory factory = new Factory();		// 先将工厂类实例化
		IProduct1 product1 = factory.createProduct1A(); // 再分别创建各种产品
		product1.show();

		IProduct1 product12 = factory.createProduct1B();
		product12.show();

		IProduct2 product2 = factory.createProduct2A();
		product2.show();

		IProduct2 product22 = factory.createProduct2B();
		product22.show();
	}
}
相关推荐
Wang's Blog1 分钟前
Java 项目实战: 交友项目 - 查询单条动态:动态详情页的接口与实现
java·开发语言·交友
yuniko-n2 分钟前
【JUC】CAS
java·开发语言
captain3764 分钟前
Spring Web MVC(2)
java·前端·spring boot·后端·spring·mvc
代码山河16 分钟前
调试技巧:IDEA Debug模式入门与使用
java·学习·架构·教程·面向对象·项目
文丑颜不良啊28 分钟前
LeetCode851~875题目解析
java·leetcode
技术老孙29 分钟前
给 Agent 装上对话框 —— AgentScope-Java 接入 Spring Boot 与 SSE 流式实战
java·开发语言·spring boot
指剑1 小时前
亚麻云之EC2——安全组与密钥对:SSH 端口怎么开才安全,Permission denied (publickey) 和连接超时排查
java·安全·ssh
_Evan_Yao9 小时前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
梓豪csd9 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
秋饼9 小时前
Spring AI 2.1 Message Parts 深度实战:推理签名回放与跨轮记忆持久化的源码级落地
java·ai·技术分享·后端开发