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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
1
00:00:00,220 --> 00:00:03,260
The example I'm going to use consists of a class called
2
00:00:03,260 --> 00:00:07,380
ImageReaderFactory which provides the factory method which is this one;
3
00:00:07,380 --> 00:00:10,250
createImageReader. As you can see the method takes an InputStream
4
00:00:10,250 --> 00:00:13,570
as input and returns an object of type ImageReader, and it's
5
00:00:13,570 --> 00:00:15,645
static so that we can invoke it even if we
6
00:00:15,645 --> 00:00:18,390
don't have an instance of the ImageReaderFactory. So what does the
7
00:00:18,390 --> 00:00:22,275
method do? Well the method first invokes, getImageType, passing the
8
00:00:22,275 --> 00:00:25,780
InputStream as a parameter and this method figures out the type
9
00:00:25,780 --> 00:00:28,820
of the image that is stored in this Inputstream and it's
10
00:00:28,820 --> 00:00:32,740
an integer. Then, based on the value of this integer, the
11
00:00:32,740 --> 00:00:35,352
method does one of several things. If the image type is
12
00:00:35,352 --> 00:00:38,970
a GIF, it will invoke the constructor for GifReader passing the
13
00:00:38,970 --> 00:00:41,610
stream as a parameter. And what will happen is that the
14
00:00:41,610 --> 00:00:44,450
GIF reader will read a GIF from the stream, create a
15
00:00:44,450 --> 00:00:47,887
corresponding object and return it. So in this case, the ImageReader
16
00:00:47,887 --> 00:00:51,460
object return will be the object representing a GIF as appropriate.
17
00:00:51,460 --> 00:00:54,610
Similarly, if the image type is JPEG, then the method will
18
00:00:54,610 --> 00:00:58,579
invoke the constructor for JPEG Reader and in this case, this constructor
19
00:00:58,579 --> 00:01:01,981
will read from the stream a JPEG, create a corresponding object
20
00:01:01,981 --> 00:01:05,640
and return it. And so on for different types of images. So
21
00:01:05,640 --> 00:01:07,880
why is this a situation in which it is appropriate to
22
00:01:07,880 --> 00:01:11,100
use the factory method pattern? One, because it corresponds exactly to the
23
00:01:11,100 --> 00:01:14,250
cases that we saw before, of applicability. This is a case
24
00:01:14,250 --> 00:01:16,560
in which we don't know the type of the object that we
25
00:01:16,560 --> 00:01:20,080
need to create until we run the code, because it depends
26
00:01:20,080 --> 00:01:22,530
on the value of the InputStream. It depends on the content
27
00:01:22,530 --> 00:01:25,590
of the InputStream. So, until we read the InputStream, we cannot
28
00:01:25,590 --> 00:01:28,380
figure out whether we need to create a GIF, a JPEG or
29
00:01:28,380 --> 00:01:30,780
some other type of image. So in this case, we want to
30
00:01:30,780 --> 00:01:33,630
do, we want to simply delegate to this classes the creation of
31
00:01:33,630 --> 00:01:35,610
the object, once we know what type of object needs to
32
00:01:35,610 --> 00:01:38,790
be created. So perfect example of application of a factory method pattern.
|