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
127131getInstance()的返回值是一个对象的引用,并不是一个新的实例,所以不要错误的理解成多个对象。
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// 这里用代理类来实例化
281278FoodService foodService = new FoodServiceProxy ();
282279foodService. 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