前言:
? 在 Java 編程里,設計模式是被反復使用、多數人知曉、經過分類編目的代碼設計經驗總結。他能幫助開發者更高效地解決常見問題,提升代碼的可維護性、可擴展性和復用性。下面介紹Java 中幾種常見的設計模式。
-
單例模式(Singleton Pattern)
-
工廠模式(Factory Pattern)
-
代理模式(Proxy Pattern)
-
裝飾器模式(Decorator Pattern)
-
觀察者模式(Observer Pattern)
-
策略模式(Strategy Pattern)
-
模板方法模式(Template Method Pattern)
-
適配器模式(Adapter Pattern)
-
責任鏈模式(Chain of Responsibility Pattern)
1.單例模式(Singleton Pattern)
核心思想:封裝化所有構造方法確保一個類只有一個實例,并提供一個全局訪問點。
示例:
public class Singleton {// 類加載時不創建實例private static volatile Singleton instance;// 私有構造函數,防止外部實例化private Singleton() {}// 提供全局訪問點,使用雙重檢查鎖定機制保證線程安全public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}
2.工廠模式(Factory Pattern)
核心思想:他通過封裝對象的創建邏輯,實現了對象創建和使用的分離,提高了代碼的可維護性和可擴展性。
示例:
// 接口
interface Shape {void draw();
}// 實現類
class Circle implements Shape {@Overridepublic void draw() {System.out.println("畫一個圓形");}
}class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("畫一個矩形");}
}// 工廠類
class ShapeFactory {public Shape getShape(String shapeType) {if (shapeType == null) {return null;}if (shapeType.equalsIgnoreCase("CIRCLE")) {return new Circle();} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {return new Rectangle();}return null;}
}
3.代理模式(Proxy Pattern)
核心思想:為其他對象提供一種代理以控制對這個對象的訪問。
示例:
// 抽象主題接口
public interface Subject {void request();
}// 真實主題類
public class RealSubject implements Subject {@Overridepublic void request() {System.out.println("RealSubject request");}
}// 代理類
public class Proxy implements Subject {private RealSubject realSubject;@Overridepublic void request() {if (realSubject == null) {realSubject = new RealSubject();}realSubject.request(); // 代理控制對真實主題的訪問}
}// 客戶端代碼
public class Client {public static void main(String[] args) {Subject proxy = new Proxy();proxy.request(); // 通過代理訪問真實主題}
}
4.裝飾器模式(Decorator Pattern)
核心思想:裝飾器模式動態地給一個對象添加一些額外的職責。
示例:
// 接口
interface Coffee {double getCost();String getDescription();
}// 基礎實現
class SimpleCoffee implements Coffee {@Overridepublic double getCost() {return 1.0;}@Overridepublic String getDescription() {return "簡單咖啡";}
}// 裝飾器抽象類
abstract class CoffeeDecorator implements Coffee {protected Coffee decoratedCoffee;public CoffeeDecorator(Coffee decoratedCoffee) {this.decoratedCoffee = decoratedCoffee;}@Overridepublic double getCost() {return decoratedCoffee.getCost();}@Overridepublic String getDescription() {return decoratedCoffee.getDescription();}
}// 具體裝飾器
class Milk extends CoffeeDecorator {public Milk(Coffee decoratedCoffee) {super(decoratedCoffee);}@Overridepublic double getCost() {return decoratedCoffee.getCost() + 0.5;}@Overridepublic String getDescription() {return decoratedCoffee.getDescription() + ", 加牛奶";}
}
5.觀察者模式(Observer Pattern)
核心思想:觀察者模式定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴它的對象都會得到通知并被自動更新。
示例:
import java.util.ArrayList;
import java.util.List;// 主題接口
interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyObservers();
}// 觀察者接口
interface Observer {void update(double temperature, double humidity, double pressure);
}// 具體主題
class WeatherData implements Subject {private List<Observer> observers;private double temperature;private double humidity;private double pressure;public WeatherData() {observers = new ArrayList<>();}@Overridepublic void registerObserver(Observer o) {observers.add(o);}@Overridepublic void removeObserver(Observer o) {observers.remove(o);}@Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update(temperature, humidity, pressure);}}public void measurementsChanged() {notifyObservers();}public void setMeasurements(double temperature, double humidity, double pressure) {this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;measurementsChanged();}
}
6.策略模式(Strategy Pattern)
核心思想:策略模式定義一系列的算法,并將每個算法封裝起來,使他們可以相互替換。
示例:
// 策略接口
interface PaymentStrategy {void pay(int amount);
}// 具體策略
class CreditCardStrategy implements PaymentStrategy {private String cardNumber;private String cvv;private String dateOfExpiry;public CreditCardStrategy(String cardNumber, String cvv, String dateOfExpiry) {this.cardNumber = cardNumber;this.cvv = cvv;this.dateOfExpiry = dateOfExpiry;}@Overridepublic void pay(int amount) {System.out.println(amount + " 元使用信用卡支付");}
}class PayPalStrategy implements PaymentStrategy {private String emailId;private String password;public PayPalStrategy(String emailId, String password) {this.emailId = emailId;this.password = password;}@Overridepublic void pay(int amount) {System.out.println(amount + " 元使用PayPal支付");}
}// 上下文
class ShoppingCart {private PaymentStrategy paymentStrategy;public void setPaymentStrategy(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void pay(int amount) {paymentStrategy.pay(amount);}
}
7.模板方法模式(Template Method Pattern)
核心思想:模板方法模式定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。
示例:
// 抽象類
abstract class Game {abstract void initialize();abstract void startPlay();abstract void endPlay();// 模板方法public final void play() {// 初始化游戲initialize();// 開始游戲startPlay();// 結束游戲endPlay();}
}// 具體類
class Cricket extends Game {@Overridevoid initialize() {System.out.println("板球游戲初始化,準備場地");}@Overridevoid startPlay() {System.out.println("板球游戲開始,玩起來!");}@Overridevoid endPlay() {System.out.println("板球游戲結束,統計分數");}
}class Football extends Game {@Overridevoid initialize() {System.out.println("足球游戲初始化,準備場地和球");}@Overridevoid startPlay() {System.out.println("足球游戲開始,踢起來!");}@Overridevoid endPlay() {System.out.println("足球游戲結束,統計分數");}
}
8.適配器模式(Adapter Pattern)
核心思想:適配器模式將一個類的接口轉換成客戶希望的另外一個接口。
示例:
// 目標接口
interface MediaPlayer {void play(String audioType, String fileName);
}// 被適配的類
class VlcPlayer {public void playVlc(String fileName) {System.out.println("播放VLC文件: " + fileName);}
}// 適配器
class MediaAdapter implements MediaPlayer {private VlcPlayer vlcPlayer;public MediaAdapter() {vlcPlayer = new VlcPlayer();}@Overridepublic void play(String audioType, String fileName) {if (audioType.equalsIgnoreCase("vlc")) {vlcPlayer.playVlc(fileName);}}
}// 具體實現類
class AudioPlayer implements MediaPlayer {private MediaAdapter mediaAdapter;@Overridepublic void play(String audioType, String fileName) {if (audioType.equalsIgnoreCase("vlc")) {mediaAdapter = new MediaAdapter();mediaAdapter.play(audioType, fileName);} else {System.out.println("播放 " + audioType + " 文件: " + fileName);}}
}
9.責任鏈模式(Chain of Responsibility Pattern)
核心思想:責任鏈模式為請求創建了一個接收者對象的鏈,每個接收者都包含對另一個接收者的引用。
示例:
// 抽象處理者
abstract class Handler {protected Handler nextHandler;public void setNextHandler(Handler nextHandler) {this.nextHandler = nextHandler;}public abstract void handleRequest(int request);
}// 具體處理者
class ConcreteHandler1 extends Handler {@Overridepublic void handleRequest(int request) {if (request < 10) {System.out.println("處理請求: " + request);} else if (nextHandler != null) {nextHandler.handleRequest(request);}}
}class ConcreteHandler2 extends Handler {@Overridepublic void handleRequest(int request) {if (request >= 10 && request < 20) {System.out.println("處理請求: " + request);} else if (nextHandler != null) {nextHandler.handleRequest(request);}}
}class ConcreteHandler3 extends Handler {@Overridepublic void handleRequest(int request) {if (request >= 20) {System.out.println("處理請求: " + request);} else if (nextHandler != null) {nextHandler.handleRequest(request);}}
}