設計模式常常被分為以下三類:
建立型
建立對象時,不再由我們直接執行個體化對象;而是根據特定情境,由程式來確定建立對象的方式。如,Factory 方法、抽象原廠模式、單例模式等。
構造型 用於協助將多個對象組織成更大的結構。如,適配器模式、橋接模式、組合器模式等。
行為型 用於協助系統間對象的通訊,以及如何控制複雜系統中的流程。如,命令模式、解譯器模式、迭代器模式等。
一、單例模式
public class Singleton { public static Singleton instance; private Singleton() { } public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } public static void main(String[] args) { Singleton instance1 = Singleton.getInstance(); Singleton instance2 = Singleton.getInstance(); System.out.println(instance1 == instance2); }}
(Spring中只需在配置實體Bean中指定 scope="singleton",便可實現單例)
二、簡單工廠
當A執行個體需要調用B執行個體的方法時,不是通過new B執行個體,而是通過一個能建立B執行個體的工廠BFactory來實現。
B b=new B();---à B b=BFactory().getB();
略為改進後變為:
當A執行個體需要調用某種方法時,這種方法可以由B執行個體或B1執行個體實現。那麼我們定義一個介面IB,讓B和B1實現該介面。並且寫一個IB工廠IBFactory,提供一個getIB()方法
public class A{private IB ib;public A(IB ib){this.ib=ib;}public void showMessage(){ib.print();}}public interface IB{public abstract void print();} public class B implements IB{public void print(){}} public clsss B1 implements IB{public void print(){}} public IBFactory{public IB getIB(){return new B();}} --------------------------IB ib=IBFactory.getIB();A a=new A(ib);a.showMessage();----------------------------
抽象原廠模式圖:
三、Factory 方法和抽象工廠
在簡單原廠模式裡,系統使用ProductFactory工廠類生產所有產品執行個體,且工廠類來決定生產那個類的執行個體。
3.1 Factory 方法 在Factory 方法中,如果我們不想在工廠類中進行邏輯判斷,程式可以為不同產品類提供不同的工廠,不同的工廠類生產不同的產品。
採用Factory 方法後,用戶端代碼成功與被調用對象的實作類別分離。
3.2 抽象原廠模式:為瞭解決用戶端代碼與不同工廠耦合的問題,接著考慮再增加一個工廠類,該類生產OutputFactory執行個體(根據傳入的參數,生產不同的工廠執行個體)
public class OutputFactoryFactory {public static OutputFactory getOutputFactory(String type) {if ("better".equalsIgnoreCase(type)) {return new BetterOutputFactory();} else {return new OutputFactory();}}}