工厂方法模式(Java)

ops/2025/2/7 5:31:52/

工厂方法模式(Java)

工厂方法模式概述

1. 工厂方法模式的定义

工厂方法模式提供了一种创建对象的方式,而无需指定具体的类。它通过定义一个接口来创建对象,具体的实例化过程由子类实现。这种方式使得代码更加灵活,易于扩展。

2. 工厂方法模式的结构

工厂方法模式主要包含以下几个角色:

  • 抽象产品(Abstract Product):定义产品的共同接口。
  • 具体产品(Concrete Product):实现了抽象产品接口,定义具体产品的特定行为。
  • 抽象工厂(Abstract Factory):声明创建产品的抽象方法。
  • 具体工厂(Concrete Factory):实现抽象工厂接口,负责实际创建具体产品的对象。

工厂方法模式的实例分析

为了更好地理解工厂方法模式,我们将通过一个简单的示例来说明。假设我们需要创建一个图形绘制程序,支持绘制不同形状的图形。

步骤 1:定义抽象产品接口

java">public interface Shape {void draw();
}

在这个接口中,我们定义了一个 draw 方法,所有具体形状类都需要实现这个方法。

步骤 2:实现具体产品类

java">public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Inside Circle::draw() method.");}
}public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Inside Rectangle::draw() method.");}
}public class Square implements Shape {@Overridepublic void draw() {System.out.println("Inside Square::draw() method.");}
}

在这些具体产品类中,我们实现了 Shape 接口的 draw 方法,分别输出不同的形状信息。

步骤 3:定义抽象工厂

java">public abstract class ShapeFactory {public abstract Shape getShape(String shapeType);
}

这里我们定义了一个抽象工厂类 ShapeFactory,它声明了一个抽象方法 getShape,用于根据形状类型返回相应的形状对象。

步骤 4:实现具体工厂

java">public class ConcreteShapeFactory extends ShapeFactory {@Overridepublic Shape getShape(String shapeType) {if (shapeType == null) {return null;}if (shapeType.equalsIgnoreCase("CIRCLE")) {return new Circle();} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {return new Rectangle();} else if (shapeType.equalsIgnoreCase("SQUARE")) {return new Square();}return null;}
}

在具体工厂类 ConcreteShapeFactory 中,我们实现了 getShape 方法,根据传入的形状类型返回相应的形状对象。

步骤 5:使用工厂

java">public class FactoryPatternDemo {public static void main(String[] args) {ShapeFactory shapeFactory = new ConcreteShapeFactory();Shape shape1 = shapeFactory.getShape("CIRCLE");shape1.draw();Shape shape2 = shapeFactory.getShape("RECTANGLE");shape2.draw();Shape shape3 = shapeFactory.getShape("SQUARE");shape3.draw();}
}

FactoryPatternDemo 类中,我们使用 ConcreteShapeFactory 来获取不同的形状对象,并调用它们的 draw 方法。

学生信息管理系统的实现

接下来,我们将利用工厂方法模式实现一个简单的学生信息管理系统。该系统支持添加不同类型的学生(如本科生和研究生)。

步骤 1:定义学生抽象类

java">public abstract class Student {protected String name;public Student(String name) {this.name = name;}public abstract void displayInfo();
}

步骤 2:实现具体学生类

java">public class Undergraduate extends Student {public Undergraduate(String name) {super(name);}@Overridepublic void displayInfo() {System.out.println("Undergraduate Student: " + name);}
}public class Graduate extends Student {public Graduate(String name) {super(name);}@Overridepublic void displayInfo() {System.out.println("Graduate Student: " + name);}
}

步骤 3:定义学生工厂

java">public abstract class StudentFactory {public abstract Student createStudent(String name);
}

步骤 4:实现具体学生工厂

java">public class ConcreteStudentFactory extends StudentFactory {@Overridepublic Student createStudent(String type, String name) {if (type.equalsIgnoreCase("UNDERGRADUATE")) {return new Undergraduate(name);} else if (type.equalsIgnoreCase("GRADUATE")) {return new Graduate(name);}return null;}
}

步骤 5:使用学生工厂

java">public class StudentManagementSystem {public static void main(String[] args) {StudentFactory studentFactory = new ConcreteStudentFactory();Student student1 = studentFactory.createStudent("UNDERGRADUATE", "Alice");student1.displayInfo();Student student2 = studentFactory.createStudent("GRADUATE", "Bob");student2.displayInfo();}
}

http://www.ppmy.cn/ops/156353.html

相关文章

机器学习8-卷积和卷积核1

机器学习8-卷积和卷积核1 卷积与图像去噪卷积的定义与性质定义性质卷积的原理卷积步骤卷积的示例与应用卷积的优缺点优点缺点 总结 高斯卷积核卷积核尺寸的设置依据任务类型考虑数据特性实验与调优 高斯函数标准差的设置依据平滑需求结合卷积核尺寸实际应用场景 总结 图像噪声与…

蓝桥杯python基础算法(2-2)——基础算法(D)——进制转换*

目录 五、进制转换 十进制转任意进制,任意进制转十进制 例题 P1230 进制转换 作业 P2095 进制转化 作业 P2489 进制 五、进制转换 十进制转任意进制,任意进制转十进制 int_to_char "0123456789ABCDEF" def Ten_to_K(k, x):answer "…

神经网络|(七)概率论基础知识-贝叶斯公式

【1】引言 前序我们已经了解了一些基础知识。 古典概型:有限个元素参与抽样,每个元素被抽样的概率相等。 条件概率:在某条件已经达成的前提下,新事件发生的概率。实际计算的时候,应注意区分,如果是计算综…

第35章 星骗计划的阴影

清晨,阳光透过窗帘缝隙,轻柔地洒落在东方艾艾的办公桌上。他揉了揉惺忪的睡眼,昨晚加班至深夜的疲惫仍未消散。在航天锐创所,刚结束一轮紧张培训,他便马不停蹄地投身于 “星渊计划:航天智擎开发项目” 的筹…

deepseek本地部署

DeepSeek本地部署详细指南 DeepSeek作为一款开源且性能强大的大语言模型,提供了灵活的本地部署方案,让用户能够在本地环境中高效运行模型,同时保护数据隐私,这里记录自己DeepSeek本地部署流程。 主机环境 cpu:amd 7500Fgpu:406…

全面掌握C#的JObject类:C#开发之JSON数据解析与操作实战指南

在C#中,处理JSON数据是日常开发中常见的任务之一。JObject类是 Newtonsoft.Json(也称为Json.NET)库的一部分,它提供了一个灵活且强大的方式来解析、查询和操作JSON数据。本文将深入探讨JObject类的各种用法,包括基本操…

PostgreSQL 数据库备份与还原

为了安全与数据共享等,创建好的数据库有时候需要备份操作和还原操作。数据库的备份与还原主要是三个命令:pg_dump、pg_dumpall 和 pg_restore 。 其中pg_dump用于备份单个数据库,它支持多种备份格式(SQL、自定义等)&a…

c++:list

1.list的使用 1.1构造 1.2迭代器遍历 (1)迭代器是算法和容器链接起来的桥梁 容器就是链表,顺序表等数据结构,他们有各自的特点,所以底层结构是不同的。在不用迭代器的前提下,如果我们的算法要作用在容器上…