設計模式(Design Pattern)是軟件設計中的一種通用解決方案,旨在解決在開發(fā)過程中遇到的常見問題。Java 作為一種面向?qū)ο蟮木幊陶Z言,支持豐富的設計模式,能夠幫助開發(fā)人員創(chuàng)建更具可維護性、可擴展性和復用性的代碼。
一、設計模式的分類
設計模式通常分為三大類:
創(chuàng)建型模式:關注如何創(chuàng)建對象。常見的設計模式有單例模式、工廠模式、抽象工廠模式、建造者模式和原型模式。
結(jié)構(gòu)型模式:關注如何將類或?qū)ο蠼M合成更大的結(jié)構(gòu)。常見的設計模式有適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式和組合模式。
行為型模式:關注對象之間的通信與協(xié)作。常見的設計模式有觀察者模式、策略模式、命令模式、責任鏈模式、狀態(tài)模式和模板方法模式。
二、常用設計模式及應用場景解析
1. 單例模式(Singleton Pattern)
定義:單例模式確保一個類只有一個實例,并提供全局訪問點。
應用場景:
需要一個類只有一個實例的情況,如數(shù)據(jù)庫連接池、線程池、日志記錄器等。
配置管理類。
實現(xiàn)方式:
懶漢式(線程不安全)
懶漢式(線程安全)
餓漢式(線程安全)
雙重檢查鎖(線程安全)
javaCopy Codepublic class Singleton {
private static Singleton instance;
// 私有構(gòu)造函數(shù),防止外部創(chuàng)建對象
private Singleton() {}
// 雙重檢查鎖的線程安全實現(xiàn)
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
2. 工廠模式(Factory Pattern)
定義:工廠模式提供了創(chuàng)建對象的接口,但由子類決定實例化哪個類。
應用場景:
需要生成大量相關或相似對象時,避免直接調(diào)用構(gòu)造函數(shù)。
需要根據(jù)不同的輸入條件選擇不同類的實例。
實現(xiàn)方式:
簡單工廠:通過一個工廠類返回不同類型的對象。
工廠方法:讓子類決定創(chuàng)建哪個具體產(chǎn)品類。
抽象工廠:創(chuàng)建一組相關的工廠,負責創(chuàng)建不同系列的產(chǎn)品。
javaCopy Code// 簡單工廠
public class AnimalFactory {
public static Animal createAnimal(String type) {
if ("Dog".equals(type)) {
return new Dog();
} else if ("Cat".equals(type)) {
return new Cat();
}
return null;
}
}
// 工廠方法
public abstract class AnimalFactory {
public abstract Animal createAnimal();
}
public class DogFactory extends AnimalFactory {
@Override
public Animal createAnimal() {
return new Dog();
}
}
3. 觀察者模式(Observer Pattern)
定義:觀察者模式定義了一種一對多的依賴關系,使得當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都會得到通知并自動更新。
應用場景:
事件驅(qū)動系統(tǒng),如 UI 更新、股票行情更新等。
需要對象間自動同步的場景。
實現(xiàn)方式:
主題類(Subject):保持一組觀察者對象,提供添加和刪除觀察者的方法。
觀察者類(Observer):定義更新接口,通知觀察者進行相應更新。
javaCopy Codepublic class Subject {
private List<Observer> observers = new ArrayList<>();
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update();
}
}
}
public interface Observer {
void update();
}
4. 策略模式(Strategy Pattern)
定義:策略模式定義了一系列算法,并將每一個算法封裝起來,使得它們可以互換。策略模式讓算法獨立于使用它的客戶端獨立變化。
應用場景:
當系統(tǒng)有多個算法可以選擇時,根據(jù)不同的需求選擇不同的算法進行計算。
例如排序算法的選擇,支付方式的選擇。
實現(xiàn)方式:
定義一個策略接口,每個策略類實現(xiàn)這個接口。
客戶端通過注入不同的策略來實現(xiàn)不同的行為。
javaCopy Codepublic interface Strategy {
int doOperation(int a, int b);
}
public class AddOperation implements Strategy {
@Override
public int doOperation(int a, int b) {
return a + b;
}
}
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public int executeStrategy(int a, int b) {
return strategy.doOperation(a, b);
}
}
5. 代理模式(Proxy Pattern)
定義:代理模式為其他對象提供一個代理,以控制對這個對象的訪問。
應用場景:
對象的創(chuàng)建成本較高,使用代理對象來延遲創(chuàng)建。
需要對訪問進行控制,如訪問權(quán)限控制、懶加載等。
實現(xiàn)方式:
虛擬代理:用于控制對象的創(chuàng)建。
遠程代理:用于表示遠程對象。
保護代理:用于控制對對象的訪問權(quán)限。
javaCopy Codepublic interface RealSubject {
void request();
}
public class RealSubjectImpl implements RealSubject {
@Override
public void request() {
System.out.println("Real Subject request.");
}
}
public class ProxySubject implements RealSubject {
private RealSubjectImpl realSubject;
@Override
public void request() {
if (realSubject == null) {
realSubject = new RealSubjectImpl();
}
realSubject.request();
}
}
6. 裝飾器模式(Decorator Pattern)
定義:裝飾器模式允許在不改變原始對象的情況下,動態(tài)地給對象添加額外的功能。
應用場景:
需要為一個對象增加額外的功能,而又不希望修改對象的源代碼。
例如日志記錄、性能監(jiān)控等。
實現(xiàn)方式:
使用裝飾器類擴展被裝飾的類功能。
javaCopy Codepublic interface Coffee {
double cost();
}
public class SimpleCoffee implements Coffee {
@Override
public double cost() {
return 5;
}
}
public class MilkDecorator implements Coffee {
private Coffee coffee;
public MilkDecorator(Coffee coffee) {
this.coffee = coffee;
}
@Override
public double cost() {
return coffee.cost() + 2;
}
}
設計模式在軟件開發(fā)中扮演著至關重要的角色。理解并掌握常用設計模式,不僅能夠提高開發(fā)效率,還能增強代碼的可維護性和可擴展性。本文介紹了幾種常見的 Java 設計模式及其應用場景,希望能幫助你更好地理解如何運用這些模式來解決實際問題。