@@ -184,16 +184,319 @@ public class FactoryMain {
184
184
```
185
185
186
186
# 单例模式
187
- *
188
- *
187
+ * Singleton的静态属性instance中,只有instance为null的时候才创建一个实例,构造函数私有,确保每次都只创建一个,避免重复创建
188
+
189
+ ``` java
190
+ /**
191
+ * <html>
192
+ * <body>
193
+ * <P> Copyright 1994 JsonInternational</p>
194
+ * <p > All rights reserved.</p>
195
+ * <p > Created on 19941115</p>
196
+ * <p > Created by Jason</p>
197
+ * </body>
198
+ * </html>
199
+ */
200
+ package cn.ucaner.pattern.create.singleton ;
201
+
202
+ /**
203
+ * @Package:cn.ucaner.pattern.create.singleton
204
+ * @ClassName:Singleton
205
+ * @Description: <p > 双重锁的单例 单例模式</p>
206
+ * @Author: -
207
+ * @CreatTime:2017年10月26日 下午5:38:56
208
+ * @Modify By:
209
+ * @ModifyTime:
210
+ * @Modify marker:
211
+ * @version V1.0
212
+ */
213
+ public class Singleton {
214
+
215
+ /**
216
+ * 防止外部创建实例 私有
217
+ * Singleton.
218
+ */
219
+ private Singleton () {
220
+
221
+ }
222
+
223
+ /**
224
+ * 唯一实例
225
+ * 内存可见性:通俗来说就是,线程A对一个volatile变量的修改,对于其它线程来说是可见的,即线程每次获取volatile变量的值都是最新的。
226
+ * https://www.cnblogs.com/chengxiao/p/6528109.html
227
+ */
228
+ private static volatile Singleton mInstance;
229
+
230
+ public static Singleton getInstance () {
231
+
232
+ if (mInstance == null ) {// 第一个锁,如果没有实例
233
+
234
+ /**
235
+ * 第二个锁,如果没有任何线程创建Singleton实例 对象锁 - 若多个线程拥有同一个MyObject类的对象,则这些方法只能以同步的方式执行
236
+ * https://www.cnblogs.com/hapjin/p/5452663.html
237
+ */
238
+ synchronized (Singleton . class) {
239
+ if (mInstance == null ) {
240
+ mInstance = new Singleton ();
241
+ }
242
+ }
243
+ }
244
+ return mInstance;
245
+ }
246
+
247
+ public static void main (String [] args ) {
248
+ System . out. println(mInstance);
249
+ }
250
+ }
251
+
252
+ ```
189
253
190
254
# 建造者模式
191
- *
192
- *
255
+ * 建造者模式,顾名思义的就是类似建房子,有一个固定的流程。在大话设计模式中,作者举了一个例子大概意思是同一道菜在中国的每一个地方都有不同的味道(LZ印象最深的是鱼香肉丝,来北方最之后印象最深的是宫保鸡丁。哈哈),而肯德基的鸡腿、汉堡在每一个城市都是一样的味道。我觉的这一个例子可以清楚的认识到建造者模式有一个固定的建造过程。建造者模式实现了依赖倒转原则,抽象不应该依赖细节,细节应该依赖与抽象。建造者模式的定义是:将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。
256
+ + 建造者模式的角色定义,在建造者模式中存在以下4个角色:
257
+ - builder:为创建一个产品对象的各个部件指定抽象接口
258
+ - ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口
259
+ - Director:构造一个使用Builder接口的对象
260
+ - Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口
261
+
262
+ ``` java
263
+ public class XMan {
264
+
265
+ private String name;
266
+
267
+ private Integer age;
268
+
269
+ private String xFactor;
270
+
271
+ private String lover;
272
+
273
+ public String getName () {
274
+ return name;
275
+ }
276
+
277
+ public XMan setName (String name ) {
278
+ this . name = name;
279
+ return this ;
280
+ }
193
281
282
+ public Integer getAge () {
283
+ return age;
284
+ }
285
+
286
+ public XMan setAge (Integer age ) {
287
+ this . age = age;
288
+ return this ;
289
+ }
290
+
291
+ public String getxFactor () {
292
+ return xFactor;
293
+ }
294
+
295
+ public XMan setxFactor (String xFactor ) {
296
+ this . xFactor = xFactor;
297
+ return this ;
298
+ }
299
+
300
+ public String getLover () {
301
+ return lover;
302
+ }
303
+
304
+ public XMan setLover (String lover ) {
305
+ this . lover = lover;
306
+ return this ;
307
+ }
308
+ }
309
+
310
+
311
+ ```
312
+
313
+ ``` java
314
+
315
+ public class WolverineDirector {
316
+
317
+ public XMan constructWolverine (WolverineBuilder wolverineBuilder ) {
318
+ return wolverineBuilder
319
+ .buildXFactor()
320
+ .buildLover()
321
+ .buildName()
322
+ .buildAge()
323
+ .buildXman();
324
+ }
325
+ }
326
+
327
+
328
+ public class WolverineBuilder implements XManBuilder {
329
+
330
+ XMan mXMan;
331
+
332
+ WolverineBuilder () {
333
+ mXMan = new XMan ();
334
+ }
335
+
336
+ // need to consider
337
+
338
+ /* @Override
339
+ public WolverineBuilder buildXFactor() {
340
+ mXMan.setxFactor("claw");
341
+ System.out.println(mXMan.getxFactor());
342
+ return this;
343
+ }*/
344
+
345
+ @Override
346
+ public XManBuilder buildXFactor () {
347
+ mXMan. setxFactor(" claw" );
348
+ System . out. println(mXMan. getxFactor());
349
+ return this ;
350
+ }
351
+
352
+ @Override
353
+ public WolverineBuilder buildLover () {
354
+ mXMan. setLover(" Jane" );
355
+ System . out. println(mXMan. getLover());
356
+ return this ;
357
+ }
358
+
359
+ @Override
360
+ public WolverineBuilder buildName () {
361
+ mXMan. setName(" Wali" );
362
+ System . out. println(mXMan. getName());
363
+ return this ;
364
+ }
365
+
366
+ @Override
367
+ public WolverineBuilder buildAge () {
368
+ mXMan. setAge(18 );
369
+ System . out. println(mXMan. getAge());
370
+ return this ;
371
+ }
372
+
373
+ @Override
374
+ public XMan buildXman () {
375
+ System . out. println(" Wolverine is successfully built" );
376
+ return mXMan;
377
+ }
378
+
379
+ }
380
+
381
+
382
+ public interface XManBuilder {
383
+
384
+ XManBuilder buildXFactor ();
385
+
386
+ XManBuilder buildLover ();
387
+
388
+ XManBuilder buildName ();
389
+
390
+ XManBuilder buildAge ();
391
+
392
+ XMan buildXman ();
393
+ }
394
+
395
+
396
+ ```
194
397
# 原型模式
195
- *
196
- *
398
+ [ 博客参考] ( https://www.cnblogs.com/lfxiao/p/6812835.html )
399
+ * 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式
400
+
401
+ ``` java
402
+ public class ShallowCopy extends BaseMessage implements Cloneable {
403
+
404
+ @Override
405
+ protected Object clone () throws CloneNotSupportedException {
406
+ ShallowCopy shallowCopy= null ;
407
+ try {
408
+ shallowCopy= (ShallowCopy ) super . clone();
409
+ }catch (Exception e){
410
+ e. printStackTrace();
411
+ }
412
+ return shallowCopy;
413
+ }
414
+
415
+ }
416
+
417
+
418
+ public class DeepCopy extends BaseMessage implements Cloneable {
419
+
420
+ @SuppressWarnings (" unchecked" )
421
+ @Override
422
+ protected Object clone () throws CloneNotSupportedException {
423
+ DeepCopy deepCopy= null ;
424
+ try {
425
+ deepCopy= (DeepCopy ) super . clone();
426
+ this . setImgList((ArrayList<String > ) this . getImgList(). clone());
427
+ }catch (Exception e){
428
+ e. printStackTrace();
429
+ }
430
+ return deepCopy;
431
+ }
432
+ }
433
+
434
+
435
+
436
+ public abstract class BaseMessage {
437
+
438
+ /**
439
+ * 发件人
440
+ */
441
+ private String send;
442
+
443
+ /**
444
+ * 收件人
445
+ */
446
+ private String receiver;
447
+
448
+ /**
449
+ * 消息
450
+ */
451
+ private String message;
452
+
453
+ private ArrayList<String > imgList = new ArrayList<> ();
454
+
455
+ public ArrayList<String > getImgList () {
456
+ return imgList;
457
+ }
458
+
459
+ public void setImgList (ArrayList<String > imgList ) {
460
+ this . imgList = imgList;
461
+ }
462
+
463
+ public String getSend () {
464
+ return send;
465
+ }
466
+
467
+ public void setSend (String send ) {
468
+ this . send = send;
469
+ }
470
+
471
+ public String getReceiver () {
472
+ return receiver;
473
+ }
474
+
475
+ public void setReceiver (String receiver ) {
476
+ this . receiver = receiver;
477
+ }
478
+
479
+ public String getMessage () {
480
+ return message;
481
+ }
482
+
483
+ public void setMessage (String message ) {
484
+ this . message = message;
485
+ }
486
+
487
+ public void addImage (String image ){
488
+ getImgList(). add(image);
489
+ }
490
+
491
+ /*
492
+ * 发送消息
493
+
494
+ public void sendMessage(){
495
+ System.out.println(getReceiver()+getMessage()+" 娃娃图片数量"+getImgList().size()+" 发件人"+getSend());
496
+ }
497
+ }
498
+
499
+ ```
197
500
198
501
# 适配器模式
199
502
*
0 commit comments