diff --git a/notes/设计模式.md b/notes/设计模式.md index 0a5f545f..85d11aad 100644 --- a/notes/设计模式.md +++ b/notes/设计模式.md @@ -72,7 +72,6 @@

- **6. 模式定义** **策略模式** :定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 @@ -194,7 +193,7 @@ FlyBehavior.FlyNoWay 观察者拥有一个主题对象的引用,因为注册、移除还有数据都在主题当中,必须通过操作主题才能完成相应功能。 -

+

**3. 问题描述** @@ -202,7 +201,7 @@ FlyBehavior.FlyNoWay **4. 解决方案类图** -

+

**5. 设计原则** @@ -218,8 +217,6 @@ public interface Subject { } ``` ```java -import java.util.ArrayList; -import java.util.List; public class WeatherData implements Subject { private List observers; @@ -336,7 +333,7 @@ StatisticsDisplay.update:1.0 1.0 1.0 **4. 问题解决方案的类图** -

+

**5. 设计原则** @@ -344,7 +341,7 @@ StatisticsDisplay.update:1.0 1.0 1.0 **6. Java I/O 中的装饰者模式** -

+

**7. 代码实现** @@ -427,15 +424,16 @@ public class StartbuzzCoffee { **2. 定义** -简单工厂不是设计模式,更像是一种编程习惯。在实例化一个超类的对象时,可以用它的所有子类来进行实例化,要根据具体需求来决定使用哪个子类。在这种情况下,把实例化的操作放到工厂来中,让工厂类来决定应该用哪个子类来实例化。这样做把客户对象和具体子类的实现解耦,客户对象不再需要知道有哪些子类以及实例化哪个子类。因为客户类往往有多个,如果不使用简单工厂,那么所有的客户类都要知道所有子类的细节,一旦子类发生改变,例如增加子类,那么所有的客户类都要发生改变。 +简单工厂不是设计模式,更像是一种编程习惯。在实例化一个超类的对象时,可以用它的所有子类来进行实例化,要根据具体情况来决定使用哪个子类。在这种情况下,把实例化的操作放到简单工厂来中,让简单工厂来决定应该用哪个子类来实例化。 -

+这样做能把客户类和具体子类的实现解耦,客户类不再需要知道有哪些子类以及实例化哪个子类。因为客户类往往有多个,如果不使用简单工厂,所有的客户类都要知道所有子类的细节。一旦子类发生改变,例如增加子类,那么所有的客户类都要发生改变。 + +

**3. 解决方案类图**

- **4. 代码实现** ```java @@ -496,19 +494,19 @@ CheesePizza **2. 模式定义** -定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。 +定义了一个创建对象的接口,但由子类决定要实例化哪个类。工厂方法让类把实例化推迟到子类。 **3. 模式类图** -在简单工厂中,创建对象的是另一个类,而在工厂方法中,是由子类来创建对象。下图中,Creator 有一个 anOperation() 方法,这个方法需要用到一组产品类,这组产品类由每个子类来创建。 - -可以为每个子类创建单独的简单工厂来创建每一个产品类,但是把简单工厂中创建对象的代码放到子类中来可以减少类的数目,因为子类不算是产品类,因此完全可以这么做。 +在简单工厂中,创建对象的是另一个类,而在工厂方法中,是由子类来创建对象。下图中,Creator 有一个 anOperation() 方法,这个方法需要用到一组产品类,这组产品类由 factoryMethod() 方法创建。该方法是抽象的,需要由子类去实现。

**4. 解决方案类图** -

+PizzaStore 由 orderPizza() 方法,顾客可以用它来下单。下单之后需要先使用 createPizza() 来制作 Pizza,这里的 createPizza() 就是 factoryMethod(),不同的 PizzaStore 子类实现了不同的 createPizza()。 + +

**5. 代码实现** @@ -799,7 +797,6 @@ private static Singleton uniqueInstance = new Singleton(); 双重校验锁先判断 uniqueInstance 是否已经被初始化了,如果没有被初始化,那么才对初始化的语句进行加锁。如果只做一次判断,那么多个线程还是有可能同时进入实例化语句块的,因此需要仅此第二次的判断。 - ```java public class Singleton { @@ -1480,12 +1477,12 @@ Context 的 request() 方法委托给 State 对象去处理。当 Context 组合 ```java public interface State { /** - * 投入25 分钱 + * 投入 25 分钱 */ void insertQuarter(); /** - * 退回25 分钱 + * 退回 25 分钱 */ void ejectQuarter(); diff --git a/pics/14583c71-8f57-4939-a9fc-065469b1bb7a.png b/pics/14583c71-8f57-4939-a9fc-065469b1bb7a.png new file mode 100644 index 00000000..0ea69d17 Binary files /dev/null and b/pics/14583c71-8f57-4939-a9fc-065469b1bb7a.png differ diff --git a/pics/58b9926c-b56c-42f7-82e3-86aa0c164d0a.jpg b/pics/58b9926c-b56c-42f7-82e3-86aa0c164d0a.jpg new file mode 100644 index 00000000..0b07fd8d Binary files /dev/null and b/pics/58b9926c-b56c-42f7-82e3-86aa0c164d0a.jpg differ diff --git a/pics/73ecb593-664e-490e-80e9-4319773113ef.png b/pics/73ecb593-664e-490e-80e9-4319773113ef.png new file mode 100644 index 00000000..6bda394f Binary files /dev/null and b/pics/73ecb593-664e-490e-80e9-4319773113ef.png differ diff --git a/pics/cfb05050-47aa-4fd1-86eb-a7c86320f81b.png b/pics/cfb05050-47aa-4fd1-86eb-a7c86320f81b.png new file mode 100644 index 00000000..7aa144dc Binary files /dev/null and b/pics/cfb05050-47aa-4fd1-86eb-a7c86320f81b.png differ diff --git a/pics/dac28811-79b6-4b75-bfa7-6b228e8ac3fb.png b/pics/dac28811-79b6-4b75-bfa7-6b228e8ac3fb.png new file mode 100644 index 00000000..467542c4 Binary files /dev/null and b/pics/dac28811-79b6-4b75-bfa7-6b228e8ac3fb.png differ diff --git a/pics/ec2f0a65-82ad-4ab9-940f-70ee9f6992cc.png b/pics/ec2f0a65-82ad-4ab9-940f-70ee9f6992cc.png new file mode 100644 index 00000000..2c0df74f Binary files /dev/null and b/pics/ec2f0a65-82ad-4ab9-940f-70ee9f6992cc.png differ