Skip to content

Commit ca01dd1

Browse files
authored
Update 设计模式.md
1 parent c3f912a commit ca01dd1

File tree

1 file changed

+75
-15
lines changed

1 file changed

+75
-15
lines changed

docs/设计模式.md

Lines changed: 75 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616

1717
创建型模式的作用就是创建对象,说到创建一个对象,最熟悉的就是 new 一个对象,然后 set 相关属性。但是,在很多场景下,我们需要给客户端提供更加友好的创建对象的方式,尤其是那种我们定义了类,但是需要提供给其他开发者用的时候。
1818

19+
工厂模式分为简单工厂模式,工厂模式,抽象工厂模式
20+
21+
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。**本质就是使用工厂方法代替new操作。**
22+
1923
### 简单工厂模式
2024

2125
```java
@@ -49,7 +53,7 @@ public class Cook {
4953
}
5054
```
5155

52-
简单地说,简单工厂模式通常就是这样,一个工厂类 XxxFactory,里面有一个静态方法,根据我们不同的参数,返回不同的派生自同一个父类(或实现同一接口)的实例对象。
56+
简单地说,**简单工厂模式通常就是这样,一个工厂类 XxxFactory,里面有一个静态方法,根据我们不同的参数,返回不同的派生自同一个父类(或实现同一接口)的实例对象。**
5357

5458
> 我们强调**职责单一**原则,一个类只提供一种功能,FoodFactory 的功能就是只要负责生产各种 Food。
5559
@@ -126,20 +130,11 @@ public class APP {
126130

127131
getInstance()的返回值是一个对象的引用,并不是一个新的实例,所以不要错误的理解成多个对象。
128132

129-
**懒汉式写法(线程安全)**
133+
**特点**
130134

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+
- 对外提供获取实例的静态方法
143138

144139
**饿汉式写法**
145140

@@ -247,6 +242,7 @@ public class FoodServiceImpl implements FoodService {
247242
return f;
248243
}
249244
}
245+
250246
```
251247

252248
被代理实现类就只需要做自己该做的事情就好了,不需要管别的。
@@ -272,6 +268,7 @@ public class FoodServiceProxy implements FoodService {
272268
return food;
273269
}
274270
}
271+
275272
```
276273

277274
客户端调用,注意,我们要用代理来实例化接口:
@@ -280,10 +277,73 @@ public class FoodServiceProxy implements FoodService {
280277
// 这里用代理类来实例化
281278
FoodService foodService = new FoodServiceProxy();
282279
foodService.makeChicken();
280+
283281
```
284282

285-
所谓代理模式,就是对被代理方法包装或者叫增强, 在面向切面编程(AOP)中,其实就是动态代理的过程。比如 Spring 中,我们自己不定义代理类,但是 Spring 会帮我们动态来定义代理,然后把我们定义在 @Before@After@Around 中的代码逻辑动态添加到代理中。
283+
所谓代理模式,**就是对被代理方法包装或者叫增强, 在面向切面编程(AOP)中,其实就是动态代理的过程。比如 Spring 中,我们自己不定义代理类,但是 Spring 会帮我们动态来定义代理,然后把我们定义在 @Before@After@Around 中的代码逻辑动态添加到代理中。**
286284

287285

288286

289287
待续。。。
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

Comments
 (0)