設(shè)計(jì)模式(Design Pattern)是軟件設(shè)計(jì)中的一種通用解決方案,旨在解決在開(kāi)發(fā)過(guò)程中遇到的常見(jiàn)問(wèn)題。Java 作為一種面向?qū)ο蟮木幊陶Z(yǔ)言,支持豐富的設(shè)計(jì)模式,能夠幫助開(kāi)發(fā)人員創(chuàng)建更具可維護(hù)性、可擴(kuò)展性和復(fù)用性的代碼。
一、設(shè)計(jì)模式的分類
設(shè)計(jì)模式通常分為三大類:
創(chuàng)建型模式:關(guān)注如何創(chuàng)建對(duì)象。常見(jiàn)的設(shè)計(jì)模式有單例模式、工廠模式、抽象工廠模式、建造者模式和原型模式。
結(jié)構(gòu)型模式:關(guān)注如何將類或?qū)ο蠼M合成更大的結(jié)構(gòu)。常見(jiàn)的設(shè)計(jì)模式有適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式和組合模式。
行為型模式:關(guān)注對(duì)象之間的通信與協(xié)作。常見(jiàn)的設(shè)計(jì)模式有觀察者模式、策略模式、命令模式、責(zé)任鏈模式、狀態(tài)模式和模板方法模式。

二、常用設(shè)計(jì)模式及應(yīng)用場(chǎng)景解析
1. 單例模式(Singleton Pattern)
定義:?jiǎn)卫J酱_保一個(gè)類只有一個(gè)實(shí)例,并提供全局訪問(wèn)點(diǎn)。
應(yīng)用場(chǎng)景:
需要一個(gè)類只有一個(gè)實(shí)例的情況,如數(shù)據(jù)庫(kù)連接池、線程池、日志記錄器等。
配置管理類。
實(shí)現(xiàn)方式:
懶漢式(線程不安全)
懶漢式(線程安全)
餓漢式(線程安全)
雙重檢查鎖(線程安全)
javaCopy Codepublic class Singleton {
private static Singleton instance;
// 私有構(gòu)造函數(shù),防止外部創(chuàng)建對(duì)象
private Singleton() {}
// 雙重檢查鎖的線程安全實(shí)現(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)建對(duì)象的接口,但由子類決定實(shí)例化哪個(gè)類。
應(yīng)用場(chǎng)景:
需要生成大量相關(guān)或相似對(duì)象時(shí),避免直接調(diào)用構(gòu)造函數(shù)。
需要根據(jù)不同的輸入條件選擇不同類的實(shí)例。
實(shí)現(xiàn)方式:
簡(jiǎn)單工廠:通過(guò)一個(gè)工廠類返回不同類型的對(duì)象。
工廠方法:讓子類決定創(chuàng)建哪個(gè)具體產(chǎn)品類。
抽象工廠:創(chuàng)建一組相關(guān)的工廠,負(fù)責(zé)創(chuàng)建不同系列的產(chǎn)品。
javaCopy Code// 簡(jiǎn)單工廠
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)
定義:觀察者模式定義了一種一對(duì)多的依賴關(guān)系,使得當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都會(huì)得到通知并自動(dòng)更新。
應(yīng)用場(chǎng)景:
事件驅(qū)動(dòng)系統(tǒng),如 UI 更新、股票行情更新等。
需要對(duì)象間自動(dòng)同步的場(chǎng)景。
實(shí)現(xiàn)方式:
主題類(Subject):保持一組觀察者對(duì)象,提供添加和刪除觀察者的方法。
觀察者類(Observer):定義更新接口,通知觀察者進(jìn)行相應(yīng)更新。
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)
定義:策略模式定義了一系列算法,并將每一個(gè)算法封裝起來(lái),使得它們可以互換。策略模式讓算法獨(dú)立于使用它的客戶端獨(dú)立變化。
應(yīng)用場(chǎng)景:
當(dāng)系統(tǒng)有多個(gè)算法可以選擇時(shí),根據(jù)不同的需求選擇不同的算法進(jìn)行計(jì)算。
例如排序算法的選擇,支付方式的選擇。
實(shí)現(xiàn)方式:
定義一個(gè)策略接口,每個(gè)策略類實(shí)現(xiàn)這個(gè)接口。
客戶端通過(guò)注入不同的策略來(lái)實(shí)現(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)
定義:代理模式為其他對(duì)象提供一個(gè)代理,以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。
應(yīng)用場(chǎng)景:
對(duì)象的創(chuàng)建成本較高,使用代理對(duì)象來(lái)延遲創(chuàng)建。
需要對(duì)訪問(wèn)進(jìn)行控制,如訪問(wèn)權(quán)限控制、懶加載等。
實(shí)現(xiàn)方式:
虛擬代理:用于控制對(duì)象的創(chuàng)建。
遠(yuǎn)程代理:用于表示遠(yuǎn)程對(duì)象。
保護(hù)代理:用于控制對(duì)對(duì)象的訪問(wèn)權(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)
定義:裝飾器模式允許在不改變?cè)紝?duì)象的情況下,動(dòng)態(tài)地給對(duì)象添加額外的功能。
應(yīng)用場(chǎng)景:
需要為一個(gè)對(duì)象增加額外的功能,而又不希望修改對(duì)象的源代碼。
例如日志記錄、性能監(jiān)控等。
實(shí)現(xiàn)方式:
使用裝飾器類擴(kuò)展被裝飾的類功能。
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;
}
}
設(shè)計(jì)模式在軟件開(kāi)發(fā)中扮演著至關(guān)重要的角色。理解并掌握常用設(shè)計(jì)模式,不僅能夠提高開(kāi)發(fā)效率,還能增強(qiáng)代碼的可維護(hù)性和可擴(kuò)展性。本文介紹了幾種常見(jiàn)的 Java 設(shè)計(jì)模式及其應(yīng)用場(chǎng)景,希望能幫助你更好地理解如何運(yùn)用這些模式來(lái)解決實(shí)際問(wèn)題。