Java和Scala學習日記3,javascala日記
1. 設計模式的類型
解析:
(1)建立型模式:這些設計模式提供了一種在建立對象的同時隱藏建立邏輯的方式,而不是使用new運算子直接執行個體化對象。這使得程式在判斷針對某個給定執行個體需要建立哪些對象時更加靈活。
- 原廠模式(Factory Pattern)
- 抽象原廠模式(Abstract Factory Pattern)
- 單例模式(Singleton Pattern)
- 建造者模式(Builder Pattern)
- 原型模式(Prototype Pattern)
(2)結構型模式:這些設計模式關注類和對象的組合。繼承概念被用來組合介面和定義組合對象獲得新功能方式。
- 適配器模式(Adapter Pattern)
- 橋接模式(Bridge Pattern)
- 過濾器模式(Filter、Criteria Pattern)
- 組合模式(Composite Pattern)
- 裝飾器模式(Decorator Pattern)
- 面板模式(Facade Pattern)
- 享元模式(Flyweight Pattern)
- 代理模式(Proxy Pattern)
(3)行為型模式:這些設計模式特別關注對象之間的通訊。
- 責任鏈模式(Chain of Responsibility Pattern)
- 命令模式(Command Pattern)
- 解譯器模式(Interpreter Pattern)
- 迭代器模式(Iterator Pattern)
- 中介者模式(Mediator Pattern)
- 備忘錄模式(Memento Pattern)
- 觀察者模式(Observer Pattern)
- 狀態模式(State Pattern)
- Null 物件模式(Null Object Pattern)
- 策略模式(Strategy Pattern)
- 模板模式(Template Pattern)
- 訪問者模式(Visitor Pattern)
(4)J2EE模式:這些設計模式特別關注展示層。這些模式是由Sun Java Center評鑑的。
- MVC 模式(MVC Pattern)
- 業務代表模式(Business Delegate Pattern)
- 組合實體模式(Composite Entity Pattern)
- Data Access Objects模式(Data Access Object Pattern)
- 前端控制器模式(Front Controller Pattern)
- 攔截過濾器模式(Intercepting Filter Pattern)
- 服務定位器模式(Service Locator Pattern)
- 傳輸對象模式(Transfer Object Pattern)
設計模式之間的關係,如下所示:
2. 原廠模式解析:建立一個Shape介面和實現Shape介面的實體類(Circle,Square,Rectangle),然後定義工廠類ShapeFactory。FactoryPatternDemo示範類使用ShapeFactory擷取Shape對象,它將向ShapeFactory傳遞資訊(CIRCLE/RECTANGLE/SQUARE),以便擷取它所需對象的類型。如下所示:說明:複雜物件適合使用原廠模式,而簡單對象,特別只需要通過new就可以完成建立的對象,無需使用原廠模式。
3. 抽象原廠模式解析:建立Shape和Color介面和實現這些介面的實體類,然後建立抽象工廠類AbstractFactory。接著定義工廠類ShapeFactory和ColorFactory,這兩個工廠類都是擴充了AbstractFactory。然後建立一個工廠創造器/產生器類FactoryProducer。AbstractFactoryPatternDemo示範類使用 FactoryProducer來擷取AbstractFactory對象。它將向AbstractFactory傳遞圖形資訊Shape(CIRCLE/RECTANGLE/SQUARE),以便擷取它所需對象的類型。同時它還向AbstractFactory傳遞顏色資訊Color(RED/GREEN/BLUE),以擷取它所需對象的類型。如下所示:
說明:抽象原廠模式(Abstract Factory Pattern)是圍繞一個超級工廠建立其它工廠,該超級工廠又稱為其它工廠的工廠,這種類型的設計模式屬於建立型模式,它提供了一種建立對象的最佳方式。在抽象原廠模式中,介面是負責建立一個相關對象的工廠,不需要顯式指定它們的類。每個產生的工廠都能按照原廠模式提供對象。
4. 單例模式 解析:建立SingleObject類,它有它的私人建構函式和本身一個靜態執行個體。SingleObject類提供一個靜態方法,供外界擷取它的靜態執行個體。SingletonPatternDemo示範類用SingleObject類擷取SingleObject對象。如下所示:
說明:單例模式涉及到一個單一的類,該類負責建立自己的對象,同時確保只有單個對象被建立。這個類提供了一種訪問其唯一的對象的方式,可以直接存取,不需要執行個體化該類的對象。getInstance()方法中需要使用同步鎖synchronized(Singleton.class)防止多線程同時進入造成instance被多次執行個體化。(1)單例模式之懶漢式(線程不安全)解析:是否Lazy初始化:是;是否多安全執行緒:否;實現難度:易。如下所示:
public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
(2)單例模式之懶漢式(安全執行緒)解析:是否Lazy初始化:是;是否多安全執行緒:是;實現難度:易。如下所示:
public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
(3)單例模式之餓漢式解析:是否Lazy初始化:否;是否多安全執行緒:是;實現難度:易。如下所示:
public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } }
(4)單例模式之雙檢鎖/雙重校正鎖(DCL,即 double-checked locking)解析:JDK版本:JDK1.5起;是否Lazy初始化:是;是否多安全執行緒:是;實現難度:較複雜。如下所示:
public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
(5)單例模式之登記式/靜態內部類解析:是否Lazy初始化:是;是否多安全執行緒:是;實現難度:一般。如下所示:
public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }
(6)單例模式之枚舉解析:JDK版本:JDK1.5起;是否Lazy初始化:否;是否多安全執行緒:是;實現難度:易。如下所示:
public enum Singleton { INSTANCE; public void whateverMethod() { } }
說明:通常,不建議使用第(1)種和第(2)種懶漢方式,建議使用第(3)種餓漢方式。只有在要明確實現lazy loading效果時,才會使用第(5)種登記方式。如果涉及到還原序列化建立對象時,可以嘗試使用第(6)種枚舉方式。如果有其它特殊的需求,可以考慮使用第(4)種雙檢鎖方式。
參考文獻:[1] 設計模式:http://www.runoob.com/design-pattern/design-pattern-tutorial.html