面對業務需求的頻繁變更,一個良好架構設計可以方便我們更容易地複用/升級/移植/維護。而良好的設計就是設計模式。設計模式,是每一位架構師/開發工程師必須掌握的技能。
本文將從設計模式的概述/實現方式,經典設計模式的Java實現給出參考。
一 設計模式的概述
- 概念
設計模式解決的是一類問題,如創建問題/接口匹配問題等
設計模式是一種通用解決方案,為了提高軟件架構的質量,一種軟件架構風格,所以掌握其思想才是主要。不可亂套用設計模式,為了設計模式而設計,只會適得其反,變得混亂難以維護。
2.組成
一個設計模式至少包含四個方面:
-模式名稱PatternName
-問題Problem
-解決方案Solution
-效果Consequence
每一個設計模式都有自己的應用場景,面對不同的問題採用不同的設計模式。
3.GoF設計模式
《Design Patterns: Elements of Reusable Object-Oriented Software》(即後述《設計模式》一書),由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著(Addison-Wesley,1995)。這幾位作者常被稱為"四人組(Gang of Four)",而這本書也就被稱為"四人組(或 GoF)"書。
所以,對於GoF提出的23個設計模式統稱為GoF設計模式。
GoF提出的23種設計模式如下:
-FactoryMethod 工廠方法:解決運行時子類創建問題
-AbstractFactory 抽象工廠模式:解決複雜對象創建問題
-Builder模式:逐步構造複雜對象返回實例
-Prototype模式:複製原型創建新對象
-Singleton模式 :保證單實例全局訪問單一
-Adapter模式:解決接口不兼容問題
-Bridge模式:把類的抽象部分和實現部分相分離,兩者獨立變化
-Composite模式:樹形結構組合對象的方法,使單個對象和組合後的對象具有一致性
-Decorator模式:動態地為對象的某一個方法增加更多的功能
-Facade模式:給一組類提供一致的訪問接口
-Flyweight模式:共享大量細粒度對象,節省創建對象需要的分配空間,時間開銷大
-Proxy模式:為對象提供訪問代理,如權限/地址控制
-Interpreter模式:定義解析容器,解析遵守給定語言和文法的句子
-TemplateMethod模式:通過操作模板,方便子類實現適用不同場景
-Chain of Responsibility 模式:將相應請求組成一條鏈,並在鏈對象上傳遞請求,保證多個對象請求可處理
-Command模式:將請求封裝為對象,如參數化/日誌/排隊等
-Iterator模式:提供順序訪問一個對象集合的各種元素方法
-Mediator模式:減少對象間的耦合性,松耦合
-Memento模式:提供一種捕獲對象狀態的方法,且不破壞對象的封裝
-Observer模式:將對象狀態廣播到一組觀察者,開發過Android的同學應該很熟悉。
-State模式:運行一個對象在其內部改變的時候改變它的行為,Activity/小程序等生命週期就是這種。
-Strategy模式:讓對象中算法的變化獨立於客戶
-Visitor模式:對對象結構中各種元素的操作,使Visitors模式可以不改變其元素類的前提下定義新操作。
每一類設計模式是為了解決一種特定類型問題。
設計模式分類:創建型/結構型/行為型
4.其他設計模式
除了GoF23種設計模式,還有其他很多種設計模式,本質上每一種設計模式都是為了解決一種或者一類問題而提出的軟件代碼架構風格。
主流J2EE還總結出一些模式:
-InterceptingFilter模式:過濾器Filer鏈
-SessionFacade模式
二 常用設計模式Java實戰
Abstract Factory 模式
案例:計算機類與PC機/Server服務器機子類的抽象工廠模式
類圖
Java項目工程圖:
源碼分析:
//計算機抽象類
public abstract class Computer {}
//PC 機子類
public class PC extends Computer {}
//Server服務器機子類
public class Server extends Computer{}
//工廠抽象接口
public interface IComputerAbstractFactory {}
//PC 計算機工廠接口實現類,用於創建PC計算機實例
public class PCFactory implements IComputerAbstractFactory {}
//Server計算機工廠接口實現類,用於創建Server計算機實例
public class ServerFactory implements IComputerAbstractFactory {}
//創建一個消費者類,該類將提供客戶端類創建子類的入口點
public class ComputerFactory {
/**
* 靜態方法:用於創建對應子類的實例對象
* @param factory 需要的類的工廠接口類
* @return 對應的類的對象
*/
public static Computer getComputer(IComputerAbstractFactory factory){
return factory.createComputer();
}
}
//主函數測試
public class MainApp {
public static void main(String[] args) {
testAbstractFactory();
}
private static void testAbstractFactory() {
//通過ComputerFactory直接獲取對象
Computer pc = ComputerFactory.getComputer(new PCFactory("2 GB","500 GB","2.4 GHz"));
Computer server = ComputerFactory.getComputer(new ServerFactory("16 GB","1 TB","2.9 GHz"));
//輸出
System.out.println("AbstractFactory PC Config::"+pc);
System.out.println("AbstractFactory Server Config::"+server);
}
}
運行結果:
源碼GitHub地址
https://github.com/1600690028/PattersMethod
三 寫在最後
我們初步認知了架構設計中使用的設計模式,對此有了初步的認識。並且實戰了抽象工廠模式。對於GoF的23種設計模式,我們還會繼續進行實戰分享,後續的設計模式實戰請繼續關注頭條號:甫義工作室
閱讀更多 甫義工作室 的文章