创建型-综合题-Factory

题目

Java设计模式练习题:工厂方法模式 —— 图片读取器工厂设计

一、背景设定

在多媒体软件开发中,不同类型的图片格式(如 .gif、.jpg、.png)需要使用各自专属的读取器来解析和处理。
为了解耦图片类型与具体读取器之间的关系,我们希望使用工厂方法模式进行设计,从而实现:

  • 新增图片格式时,只需添加新的读取器类及其对应的工厂类;
  • 避免在客户端代码中使用大量 if-else 或 switch 语句判断图片类型;
  • 实现“开放-封闭原则”:对扩展开放,对修改封闭。

二、任务说明

请设计一个程序来读取不同格式的图片,使用工厂方法设计模式,完成以下功能:

1. 1. 抽象产品类 ImageReader

· 定义图片读取器的统一接口,声明方法 void read(),用于读取图片内容。

2. 2. 具体产品类

· - GifReader:实现 read() 方法,输出:读取GIF图片。

· - JpgReader:实现 read() 方法,输出:读取JPG图片。

3. 3. 抽象工厂类 ImageReaderFactory

· 定义工厂接口,声明方法 ImageReader createReader(),用于创建图片读取器对象。

4. 4. 具体工厂类

· - GifReaderFactory:创建并返回 GifReader 实例;

· - JpgReaderFactory:创建并返回 JpgReader 实例。

5. 5. 客户端类 Client

  • 客户端不直接依赖具体产品类,而是依赖工厂类;
  • 客户端通过传入不同的工厂对象来创建所需的图片读取器;
  • 最后调用 read() 方法模拟图片读取。

三、结构图(文字表示)

[ImageReader]           ← 接口(产品)
  ↑       ↑
[GifReader] [JpgReader] ← 具体产品类

[ImageReaderFactory]     ← 工厂接口
  ↑         ↑
[GifReaderFactory] [JpgReaderFactory] ← 具体工厂

         [Client]        ← 客户端

四、示例运行结果

使用GifReaderFactory:
读取GIF图片。

使用JpgReaderFactory:
读取JPG图片。

五、编程提示

  • 使用 interface 或 abstract class 定义工厂和产品接口;
  • 工厂方法命名为 createReader();
  • 客户端中通过传入不同的工厂对象来创建不同格式的图片读取器;
  • 增加新格式如 PngReader 时,只需增加 PngReader 类及 PngReaderFactory,无需修改客户端代码。

六、拓展建议(选做)

  • 利用配置文件或用户输入动态选择读取器工厂;
  • 尝试使用 Java 的反射机制实现更灵活的工厂创建逻辑;
  • 思考:和简单工厂模式的区别?

代码实现

PlantUML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
@startuml
!theme plain

' 1. 抽象产品接口
interface ImageReader {
+ read(): void
}

' 2. 具体产品类
class GifReader {
+ read(): void
}

class JpgReader {
+ read(): void
}

' 3. 抽象工厂接口
interface ImageReaderFactory {
+ createReader(): ImageReader
}

' 4. 具体工厂类
class GifReaderFactory {
+ createReader(): ImageReader
}

class JpgReaderFactory {
+ createReader(): ImageReader
}

' 5. 客户端类
class Client_1 {
+ {static} main(args: String[]): void
}

' 关系定义

' 具体产品实现抽象产品接口
ImageReader <|.. GifReader
ImageReader <|.. JpgReader

' 具体工厂实现抽象工厂接口
ImageReaderFactory <|.. GifReaderFactory
ImageReaderFactory <|.. JpgReaderFactory

' 具体工厂创建具体产品
GifReaderFactory ..> GifReader : creates >
JpgReaderFactory ..> JpgReader : creates >

' 抽象工厂与抽象产品之间的关系 (工厂方法返回抽象产品)
ImageReaderFactory ..> ImageReader : creates >

' 客户端使用抽象工厂和抽象产品
Client_1 ..> ImageReaderFactory
Client_1 ..> ImageReader

@enduml