文章

23种设计模式----原型模式----创建型模式

本文深入探讨了设计模式中的原型模式,阐述了其原理、应用场景及实现方式。通过具体实例,展示了如何利用原型模式解决对象实例创建复杂、属性繁多等问题,以及如何通过管理类实现对象的高效复用。

23种设计模式----原型模式----创建型模式

文章信息

  • 原文链接:https://jiayq.blog.csdn.net/article/details/83509667
  • 发布时间:2018-10-29 17:25:12
  • 阅读量:1
  • 分类:java同时被 2 个专栏收录, 订阅专栏, 设计模式
  • 标签:#设计模式, #原型模式, #创建型模式, #框架的解耦, #复杂的实例创建

摘要

文章浏览阅读1w次。本文深入探讨了设计模式中的原型模式,阐述了其原理、应用场景及实现方式。通过具体实例,展示了如何利用原型模式解决对象实例创建复杂、属性繁多等问题,以及如何通过管理类实现对象的高效复用。


原型模式

  • 1.1什么是原型模式
  • 1.2为什么要使用原型模式
  • 2.原型模式的解释
  • 3.例子
    • 3.1例子将要实现的目标
      • 3.2例子设计
      • 3.3原型类
      • 3.4具体实现的3个原型实例类
      • 3.5管理类
      • 3.6工具类
      • 3.7测试类
      • 3.8测试结果
  • 4原型模式的扩充
    • 4.1管理类使用为单例模式
      • 4.2增加单例对象初始化(客户化)
      • 4.3修改测试类
      • 4.4输出结果
  • 5.总结

23种设计模式

1.1什么是原型模式

根据实例来创建实例。

1.2为什么要使用原型模式

主要为了解决以下3个问题:
1.当对象实例非常大,属性及操作非常多,无法全部装到一个类中时;
2.对象实例的创建非常复杂,比如创建一个对象实例,需要进行许多的操作,才能得到满足要求的实例;
3.框架解耦。使代码具有通用性,解耦与类的关联。

2.原型模式的解释

原型模式中的角色:

原型
原型是定义原型模式将以什么方式来创建原型,以及这些原型实例将要实现的方法。

原型的实现
原型的实现就是实现了原型中未实现的方法的类,也是具体的实例的类。

管理者
原型实例存储的对象,也是原型实例管理的类。

3.例子

3.1例子将要实现的目标

1.第一个类,我通过设置字符,将我传入的字符串用设置的字符包围输出

1
2
3
4
5
6
input:
how are you
output:
#############
#how are you#
#############

2.第二个类,输出传入字符串的回文字符串

1
2
3
4
5
6
input:
im OK
output:
im OKKO mi

paindromeemordniap

3.第三个类,对传入的字符串进行每个字符进行复制

1
2
3
4
5
6
7
8
input:
BaLaBaLa
output:
BBaaLLaaBBaaLLaa

BBaaLLaaBBaaLLaa

BBaaLLaaBBaaLLaa

3.2例子设计

根据原型模式,例子中包含的类可以分为4类
1.原型
2.具体实现的原型
3.管理
4.测试

3.3原型类

1
2
3
4
5
6
7
public abstract interface Print extends Cloneable{

	public abstract void print(String string);
	
	public abstract Print myClone();
	
}

3.4具体实现的3个原型实例类

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
public class Surround implements Print{

	private char c = ' ';
	
	public void setChar(char c){
		this.c = c;
	}
	
	@Override
	public Print myClone() {
		try {
			super.clone();
		} catch (Exception e) {
			System.out.println("clone exception!");
		}
		Surround exclamation = new Surround();
		exclamation.setChar(c);
		return (Print) exclamation;
	}

	@Override
	public void print(String string) {
		PrintUtils.printSurround(c, string);
	}

}




public class Palindrome implements Print {

	private String ss = "";
	
	public void setString(String string){
		ss = string;
	}
	
	@Override
	public Print myClone() {
		try {
			super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		Palindrome palindrome = new Palindrome();
		palindrome.setString(ss);
		return (Print) palindrome;
	}

	@Override
	public void print(String string) {
		PrintUtils.printPalindrome(string);
		PrintUtils.printPalindrome(ss);
	}

}




public class Reread implements Print{

	private int num;
	
	public void setNum(int num) {
		this.num = num;
	}
	
	@Override
	public void print(String string) {
		while(num > 0){
			PrintUtils.printReread(string);
			num--;
		}
	}

	@Override
	public Print myClone() {
		try {
			super.clone();
		} catch (Exception e) {
			System.out.println("clone exception!");
		}
		Reread reread = new Reread();
		reread.setNum(num);
		return (Print) reread;
	}

}

3.5管理类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.HashMap;
import java.util.Map;

public class Manage {

	private Map<String, Print> proMap = new HashMap<String, Print>();
	
	public void register(String name,Print print){
		proMap.put(name, print.myClone());
	}
	
	public Print create(String name){
		return proMap.get(name).myClone();
	}
	
	
}

3.6工具类

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
public class PrintUtils {

	
	public static void printReread(String string){
		System.out.println();
		for(int i = 0;i < string.length();i++){
			System.out.print(string.charAt(i));
			System.out.print(string.charAt(i));
		}
		System.out.println();
	}
	
	public static void printPalindrome(String string){
		System.out.println();
		System.out.print(string);
		for(int i = string.length() - 1;i >= 0;i--){
			System.out.print(string.charAt(i));
		}
		System.out.println();
	}
	
	public static void printSurround(char c,String string){
		System.out.println();
		for(int i = 0;i < string.length() + 2;i++){
			System.out.print(c);
		}
		System.out.println();
		System.out.print(c);
		System.out.print(string);
		System.out.println(c);
		for(int i = 0;i < string.length() + 2;i++){
			System.out.print(c);
		}
		System.out.println();
		System.out.println();
	}
	
}

3.7测试类

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
package cn.com.startimes.prototype;

public class Main {

	public static void main(String[] args) {
		Manage manage = new Manage();
		
		Surround exclamation = new Surround();
		exclamation.setChar('!');
		
		manage.register("!", exclamation);
		
		exclamation.setChar('@');
		
		manage.register("@", exclamation);
		
		exclamation.setChar('#');
		
		manage.register("#", exclamation);
		
		
		manage.create("#").print("how are you");
		
		Palindrome palindrome = new Palindrome();
		palindrome.setString("paindrome");
		manage.register("pal", palindrome);
		
		manage.create("pal").print("im OK");
		
		Reread reread = new Reread();
		reread.setNum(3);
		
		manage.register("reread", reread);
		
		manage.create("reread").print("BaLaBaLa");
	}

}

3.8测试结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#############
#how are you#
#############


im OKKO mi

paindromeemordniap

BBaaLLaaBBaaLLaa

BBaaLLaaBBaaLLaa

BBaaLLaaBBaaLLaa

4原型模式的扩充

4.1管理类使用为单例模式

使用饿汉式—-类加载时创建

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
import java.util.HashMap;
import java.util.Map;

public class Manage {
	
	private static final Manage MANAGE = new Manage();
	
	private Manage(){
		
	}
	
	public static Manage getManage(){
		return MANAGE;
	}
	
	private Map<String, Print> proMap = new HashMap<String, Print>();
	
	public void register(String name,Print print){
		proMap.put(name, print.myClone());
	}
	
	public Print create(String name){
		return proMap.get(name).myClone();
	}
	
	
}

4.2增加单例对象初始化(客户化)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ManageSurr{

	//使用键盘字符初始化30-122
	public static void init(){
		Manage manage = Manage.getManage();
		Surround exclamation = new Surround();
		for(int i = 30;i <= 122;i++){
			exclamation.setChar((char)i);
			manage.register((char)i+"", exclamation);
		}
		
	}
	
}

4.3修改测试类

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
public class Main {

	public static void main(String[] args) {
		Manage manage = Manage.getManage();
		
		ManageSurr.init();
		
		for(int i = 30;i <= 122;i++){
			manage.create((char)i+"").print("how are you");
		}
		
		
		Palindrome palindrome = new Palindrome();
		palindrome.setString("paindrome");
		manage.register("pal", palindrome);
		
		manage.create("pal").print("im OK");
		
		Reread reread = new Reread();
		reread.setNum(3);
		
		manage.register("reread", reread);
		
		manage.create("reread").print("BaLaBaLa");
	}

}

4.4输出结果

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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
how are you




how are you



             
 how are you 
             


!!!!!!!!!!!!!
!how are you!
!!!!!!!!!!!!!


"""""""""""""
"how are you"
"""""""""""""


#############
#how are you#
#############


$$$$$$$$$$$$$
$how are you$
$$$$$$$$$$$$$


%%%%%%%%%%%%%
%how are you%
%%%%%%%%%%%%%


&&&&&&&&&&&&&
&how are you&
&&&&&&&&&&&&&


'''''''''''''
'how are you'
'''''''''''''


(((((((((((((
(how are you(
(((((((((((((


)))))))))))))
)how are you)
)))))))))))))


*************
*how are you*
*************


+++++++++++++
+how are you+
+++++++++++++


,,,,,,,,,,,,,
,how are you,
,,,,,,,,,,,,,


-------------
-how are you-
-------------


.............
.how are you.
.............


/////////////
/how are you/
/////////////


0000000000000
0how are you0
0000000000000


1111111111111
1how are you1
1111111111111


2222222222222
2how are you2
2222222222222


3333333333333
3how are you3
3333333333333


4444444444444
4how are you4
4444444444444


5555555555555
5how are you5
5555555555555


6666666666666
6how are you6
6666666666666


7777777777777
7how are you7
7777777777777


8888888888888
8how are you8
8888888888888


9999999999999
9how are you9
9999999999999


:::::::::::::
:how are you:
:::::::::::::


;;;;;;;;;;;;;
;how are you;
;;;;;;;;;;;;;


<<<<<<<<<<<<<
<how are you<
<<<<<<<<<<<<<


=============
=how are you=
=============


>>>>>>>>>>>>>
>how are you>
>>>>>>>>>>>>>


?????????????
?how are you?
?????????????


@@@@@@@@@@@@@
@how are you@
@@@@@@@@@@@@@


AAAAAAAAAAAAA
Ahow are youA
AAAAAAAAAAAAA


BBBBBBBBBBBBB
Bhow are youB
BBBBBBBBBBBBB


CCCCCCCCCCCCC
Chow are youC
CCCCCCCCCCCCC


DDDDDDDDDDDDD
Dhow are youD
DDDDDDDDDDDDD


EEEEEEEEEEEEE
Ehow are youE
EEEEEEEEEEEEE


FFFFFFFFFFFFF
Fhow are youF
FFFFFFFFFFFFF


GGGGGGGGGGGGG
Ghow are youG
GGGGGGGGGGGGG


HHHHHHHHHHHHH
Hhow are youH
HHHHHHHHHHHHH


IIIIIIIIIIIII
Ihow are youI
IIIIIIIIIIIII


JJJJJJJJJJJJJ
Jhow are youJ
JJJJJJJJJJJJJ


KKKKKKKKKKKKK
Khow are youK
KKKKKKKKKKKKK


LLLLLLLLLLLLL
Lhow are youL
LLLLLLLLLLLLL


MMMMMMMMMMMMM
Mhow are youM
MMMMMMMMMMMMM


NNNNNNNNNNNNN
Nhow are youN
NNNNNNNNNNNNN


OOOOOOOOOOOOO
Ohow are youO
OOOOOOOOOOOOO


PPPPPPPPPPPPP
Phow are youP
PPPPPPPPPPPPP


QQQQQQQQQQQQQ
Qhow are youQ
QQQQQQQQQQQQQ


RRRRRRRRRRRRR
Rhow are youR
RRRRRRRRRRRRR


SSSSSSSSSSSSS
Show are youS
SSSSSSSSSSSSS


TTTTTTTTTTTTT
Thow are youT
TTTTTTTTTTTTT


UUUUUUUUUUUUU
Uhow are youU
UUUUUUUUUUUUU


VVVVVVVVVVVVV
Vhow are youV
VVVVVVVVVVVVV


WWWWWWWWWWWWW
Whow are youW
WWWWWWWWWWWWW


XXXXXXXXXXXXX
Xhow are youX
XXXXXXXXXXXXX


YYYYYYYYYYYYY
Yhow are youY
YYYYYYYYYYYYY


ZZZZZZZZZZZZZ
Zhow are youZ
ZZZZZZZZZZZZZ


[[[[[[[[[[[[[
[how are you[
[[[[[[[[[[[[[


\\\\\\\\\\\\\
\how are you\
\\\\\\\\\\\\\


]]]]]]]]]]]]]
]how are you]
]]]]]]]]]]]]]


^^^^^^^^^^^^^
^how are you^
^^^^^^^^^^^^^


_____________
_how are you_
_____________

//这里因为英文的点和csdn的代码标记相同,所以认为加上\
//原本的输出是没有\
\`````````````
`how are you`
\`````````````


aaaaaaaaaaaaa
ahow are youa
aaaaaaaaaaaaa


bbbbbbbbbbbbb
bhow are youb
bbbbbbbbbbbbb


ccccccccccccc
chow are youc
ccccccccccccc


ddddddddddddd
dhow are youd
ddddddddddddd


eeeeeeeeeeeee
ehow are youe
eeeeeeeeeeeee


fffffffffffff
fhow are youf
fffffffffffff


ggggggggggggg
ghow are youg
ggggggggggggg


hhhhhhhhhhhhh
hhow are youh
hhhhhhhhhhhhh


iiiiiiiiiiiii
ihow are youi
iiiiiiiiiiiii


jjjjjjjjjjjjj
jhow are youj
jjjjjjjjjjjjj


kkkkkkkkkkkkk
khow are youk
kkkkkkkkkkkkk


lllllllllllll
lhow are youl
lllllllllllll


mmmmmmmmmmmmm
mhow are youm
mmmmmmmmmmmmm


nnnnnnnnnnnnn
nhow are youn
nnnnnnnnnnnnn


ooooooooooooo
ohow are youo
ooooooooooooo


ppppppppppppp
phow are youp
ppppppppppppp


qqqqqqqqqqqqq
qhow are youq
qqqqqqqqqqqqq


rrrrrrrrrrrrr
rhow are your
rrrrrrrrrrrrr


sssssssssssss
show are yous
sssssssssssss


ttttttttttttt
thow are yout
ttttttttttttt


uuuuuuuuuuuuu
uhow are youu
uuuuuuuuuuuuu


vvvvvvvvvvvvv
vhow are youv
vvvvvvvvvvvvv


wwwwwwwwwwwww
whow are youw
wwwwwwwwwwwww


xxxxxxxxxxxxx
xhow are youx
xxxxxxxxxxxxx


yyyyyyyyyyyyy
yhow are youy
yyyyyyyyyyyyy


zzzzzzzzzzzzz
zhow are youz
zzzzzzzzzzzzz


im OKKO mi

paindromeemordniap

BBaaLLaaBBaaLLaa

BBaaLLaaBBaaLLaa

BBaaLLaaBBaaLLaa

5.总结

使用原型模式的重要点在于两个方面:
1.原型的接口定义
2.原型的管理实现
我们发现,原型模式解耦主要是对于原型模式种的原型类以及管理类,对于这两个类而言,他们的关联范围就是这两个类。
怎么理解,对于原型类,他是操作的提供者,原型类的关联范围就是他自己。
对于管理类,管理类是原型类的操作的使用者,管理类的关联范围是原型类和他自己。
3.无限的扩充
因为原型是个接口,所以具体的原型实例类可以无限的扩充。
只要一个类实现了接口中定义的方法,那么,这个类就是原型的扩充类。
4.框架的解耦
框架的解耦就是依赖以上3点,对于框架内部的类:原型类和管理类,他们不再乎你能扩充多少,或者有多少的其他操作。他们只关心接口中的操作,以及对应的关联范围。
5.普通类的使用
普通类使用框架,也不需要关心框架类的具体实现,普通的扩充类只关心需要实现的接口的方法。
23种设计模式

本文由作者按照 CC BY 4.0 进行授权