代碼更優(yōu)雅!開發(fā)者不能錯過的五種設計模式
在軟件開發(fā)中,我們常常會遇到一些常見類型的問題。
設計模式通過提供高效且經過驗證的方法來處理這些問題,從而幫助開發(fā)人員創(chuàng)建高效且具有適應性的解決方案。
這些設計模式是后端開發(fā)的重要組成部分,它們?yōu)榻鉀Q問題提供了結構化的方法,從而提高了性能。
接下來,我們簡要討論五種設計模式,這些模式在軟件開發(fā)人員中非常受歡迎。
觀察者設計模式 (Observer Design Pattern)
如果我們需要在對象之間建立一對多的關系,可以使用這種設計模式。
一個類負責跟蹤每個觀察者對象的狀態(tài),當檢測到變化時,通知這些觀察者對象。
這種模式可用于分布式事件處理。
它屬于行為型設計模式。
代碼示例:
import java.util.ArrayList;
import java.util.List;
interface Observer {
void perform(String message);
}
class FirstObserver implements Observer {
private String name;
public FirstObserver(String name) {
this.name = name;
}
public void perform(String message) {
System.out.println(name + " received update: " + message);
}
}
class SecondObserver implements Observer {
private String name;
public SecondObserver(String name) {
this.name = name;
}
public void perform(String message) {
System.out.println(name + " received update: " + message);
}
}
class Tracker {
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(String message) {
for (Observer observer : observers) {
observer.perform(message);
}
}
}
單例設計模式 (Singleton Design Pattern)
當我們需要一個類只有一個實例時,可以使用單例設計模式。
這通常適用于數據庫管理類或緩存管理類等場景。在這些情況下,我們希望只建立一次與數據庫或緩存的連接。
代碼示例:
public class SingletonDesignPattern {
private static SingletonDesignPattern instance;
private SingletonDesignPattern() {}
public static SingletonDesignPattern getInstance() {
if (instance == null) {
instance = new SingletonDesignPattern();
}
return instance;
}
}
注意,上述getInstance()方法不是線程安全的。如果在多線程環(huán)境中使用,需要額外處理線程安全問題。
策略設計模式 (Strategy Design Pattern)
策略設計模式通過將算法與其上下文分離并在運行時動態(tài)切換算法,促進了代碼的靈活性和可維護性。
它屬于行為型設計模式。
這種模式允許我們在運行時動態(tài)地改變算法,從而提高了代碼的可擴展性。
工廠設計模式 (Factory Design Pattern)
如果一個類有多個子類,并且我們需要根據某些輸入選擇具體的子類,可以使用工廠設計模式。
這種模式避免了父類和子類之間的緊耦合。
它是一種創(chuàng)建型設計模式,可以定義一個接口或抽象類用于創(chuàng)建對象,但實例化的類由子類決定。
代碼示例:
interface Shape {
void draw();
}
class Circle implements Shape {
public void draw() {
System.out.println("This is a circle");
}
}
class Rectangle implements Shape {
public void draw() {
System.out.println("This is a rectangle");
}
}
class ShapeFactory {
public Shape getShape(String shapeType) {
switch(shapeType){
case "CIRCLE":
return new Circle();
case "RECTANGLE":
return new Rectangle();
default:
return null;
}
}
}
構建器設計模式 (Builder Design Pattern)
構建器設計模式通過一步步構建對象,保持代碼的簡潔性。它將對象的構造過程與表示過程分離。
這種模式特別適合對象構造過程復雜或有多種創(chuàng)建方式的情況。
我們可以通過創(chuàng)建一個靜態(tài)內部類,并賦予其與外部類相同的屬性,來實現這種模式。
代碼示例:
public class Order {
private final List<Item> items;
private final String customerName;
private final Address deliveryAddress;
private Order(List<Item> items, String customerName, Address deliveryAddress) {
this.items = items;
this.customerName = customerName;
this.deliveryAddress = deliveryAddress;
}
public static class Builder {
private List<Item> items = new ArrayList<>();
private String customerName;
private Address deliveryAddress;
public Builder addItem(Item item) {
items.add(item);
return this;
}
public Builder setCustomerName(String customerName) {
this.customerName = customerName;
return this;
}
public Builder setDeliveryAddress(Address deliveryAddress) {
this.deliveryAddress = deliveryAddress;
return this;
}
public Order build() {
return new Order(items, customerName, deliveryAddress);
}
}
}
注意,Order類的構造方法被設置為私有,并且未提供任何 setter 方法。這強制我們使用 Builder 類,增強了代碼的靈活性和可維護性。
總結
以上介紹了幾種在組織中廣泛使用的設計模式。此外,還有裝飾器模式、適配器模式、外觀模式等設計模式。
掌握這些設計模式可以極大地提高軟件開發(fā)效率,幫助我們更好地管理復雜性,并編寫出靈活、可復用且干凈的代碼。