16
16
17
17
创建型模式的作用就是创建对象,说到创建一个对象,最熟悉的就是 new 一个对象,然后 set 相关属性。但是,在很多场景下,我们需要给客户端提供更加友好的创建对象的方式,尤其是那种我们定义了类,但是需要提供给其他开发者用的时候。
18
18
19
+ 工厂模式分为简单工厂模式,工厂模式,抽象工厂模式
20
+
21
+ 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。** 本质就是使用工厂方法代替new操作。**
22
+
19
23
### 简单工厂模式
20
24
21
25
``` java
@@ -49,7 +53,7 @@ public class Cook {
49
53
}
50
54
```
51
55
52
- 简单地说,简单工厂模式通常就是这样,一个工厂类 XxxFactory,里面有一个静态方法,根据我们不同的参数,返回不同的派生自同一个父类(或实现同一接口)的实例对象。
56
+ 简单地说,** 简单工厂模式通常就是这样,一个工厂类 XxxFactory,里面有一个静态方法,根据我们不同的参数,返回不同的派生自同一个父类(或实现同一接口)的实例对象。**
53
57
54
58
> 我们强调** 职责单一** 原则,一个类只提供一种功能,FoodFactory 的功能就是只要负责生产各种 Food。
55
59
@@ -126,20 +130,11 @@ public class APP {
126
130
127
131
getInstance()的返回值是一个对象的引用,并不是一个新的实例,所以不要错误的理解成多个对象。
128
132
129
- ** 懒汉式写法(线程安全) **
133
+ ** 特点 **
130
134
131
- ``` java
132
- public class Singleton {
133
- private static Singleton instance;
134
- private Singleton (){}
135
- public static synchronized Singleton getInstance () {
136
- if (instance == null ) {
137
- instance = new Singleton ();
138
- }
139
- return instance;
140
- }
141
- }
142
- ```
135
+ - 类构造器私有
136
+ - 持有自己类型的属性
137
+ - 对外提供获取实例的静态方法
143
138
144
139
** 饿汉式写法**
145
140
@@ -247,6 +242,7 @@ public class FoodServiceImpl implements FoodService {
247
242
return f;
248
243
}
249
244
}
245
+
250
246
```
251
247
252
248
被代理实现类就只需要做自己该做的事情就好了,不需要管别的。
@@ -272,6 +268,7 @@ public class FoodServiceProxy implements FoodService {
272
268
return food;
273
269
}
274
270
}
271
+
275
272
```
276
273
277
274
客户端调用,注意,我们要用代理来实例化接口:
@@ -280,10 +277,73 @@ public class FoodServiceProxy implements FoodService {
280
277
// 这里用代理类来实例化
281
278
FoodService foodService = new FoodServiceProxy ();
282
279
foodService. makeChicken();
280
+
283
281
```
284
282
285
- 所谓代理模式,就是对被代理方法包装或者叫增强, 在面向切面编程(AOP)中,其实就是动态代理的过程。比如 Spring 中,我们自己不定义代理类,但是 Spring 会帮我们动态来定义代理,然后把我们定义在 @Before 、@After 、@Around 中的代码逻辑动态添加到代理中。
283
+ 所谓代理模式,** 就是对被代理方法包装或者叫增强, 在面向切面编程(AOP)中,其实就是动态代理的过程。比如 Spring 中,我们自己不定义代理类,但是 Spring 会帮我们动态来定义代理,然后把我们定义在 @Before 、@After 、@Around 中的代码逻辑动态添加到代理中。**
286
284
287
285
288
286
289
287
待续。。。
288
+
289
+ ## 行为型模式
290
+
291
+ ### 模板模式
292
+
293
+ 在含有继承结构的代码中,模板方法模式是非常常用的。
294
+
295
+ ** 父类定义了骨架(调用哪些方法及顺序),某些特定方法由子类实现**
296
+
297
+ 模板方法只负责定义第一步应该要做什么,第二步应该做什么,第三步应该做什么,至于怎么做,由子类来实现。
298
+
299
+ 好处:代码复用,减少重复代码。除了子类要实现的特定方法,其他方法及方法调用顺序都在父类中预先写好
300
+
301
+ 缺点: 每一个不同的实现都需要一个子类来实现,导致类个数增加,使系统更加庞大
302
+
303
+ ** 模板模式的关键点:**
304
+
305
+ 1、使用抽象类定义模板类,并在其中定义所有的基本方法、模板方法,钩子方法,不限数量,以实现功能逻辑为主。其中基本方法使用final修饰,其中要调用基本方法和钩子方法,基本方法和钩子方法可以使用protected修饰,表明可被子类修改。
306
+
307
+ 2、定义实现抽象类的子类,重写其中的模板方法,甚至钩子方法,完善具体的逻辑。
308
+
309
+ 使用场景:
310
+
311
+ 1、在多个子类中拥有相同的方法,而且逻辑相同时,可以将这些方法抽出来放到一个模板抽象类中。
312
+
313
+ 2、程序主框架相同,细节不同的情况下,也可以使用模板方法。
314
+
315
+ #### 架构方法介绍
316
+
317
+ 模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。其主要分为两大类:模版方法和基本方法,而基本方法又分为:抽象方法(Abstract Method),具体方法(Concrete Method),钩子方法(Hook Method)。
318
+
319
+ 四种方法的基本定义(前提:在抽象类中定义):
320
+
321
+ (1)抽象方法:由抽象类声明,由具体子类实现,并以abstract关键字进行标识。
322
+
323
+ (2)具体方法:由抽象类声明并且实现,子类并不实现或者做覆盖操作。其实质就是普遍适用的方法,不需要子类来实现。
324
+
325
+ (3)钩子方法:由抽象类声明并且实现,子类也可以选择加以扩展。通常抽象类会给出一个空的钩子方法,也就是没有实现的扩展。** 它和具体方法在代码上没有区别,不过是一种意识的区别** ;而它和抽象方法有时候也是没有区别的,就是在子类都需要将其实现的时候。而不同的是抽象方法必须实现,而钩子方法可以不实现。也就是说钩子方法为你在实现某一个抽象类的时候提供了可选项,** 相当于预先提供了一个默认配置。**
326
+
327
+ (4)模板方法:定义了一个方法,其中定义了整个逻辑的基本骨架。
328
+
329
+ ``` java
330
+ public abstract class AbstractTemplate {
331
+ // 这就是模板方法
332
+ public void templateMethod () {
333
+ init();
334
+ apply(); // 这个是重点
335
+ end(); // 可以作为钩子方法
336
+ }
337
+ // 这是具体方法
338
+ protected void init () {
339
+ System . out. println(" init 抽象层已经实现,子类也可以选择覆写" );
340
+ }
341
+
342
+ // 这是抽象方法,留给子类实现
343
+ protected abstract void apply ();
344
+ // 这是钩子方法,可定义一个默认操作,或者为空
345
+ protected void end () {
346
+ }
347
+ }
348
+
349
+ ```
0 commit comments