← 返回首页
🧩

GoF设计模式在架构中的应用

📂 architecture ⏱ 1 min 150 words

GoF设计模式在架构中的应用

设计模式与架构的关系

GoF(Gang of Four)的23种设计模式是软件工程的基石,它们为架构设计提供了经过验证的解决方案模板。在架构层面,设计模式不仅是代码层面的技巧,更是系统级设计决策的基础。

// 工厂模式在架构中的应用 - 抽象工厂创建整个产品族
public interface DatabaseFactory {
    Connection createConnection();
    QueryExecutor createQueryExecutor();
    TransactionManager createTransactionManager();
}

public class MySQLFactory implements DatabaseFactory {
    public Connection createConnection() { return new MySQLConnection(); }
    public QueryExecutor createQueryExecutor() { return new MySQLQueryExecutor(); }
    public TransactionManager createTransactionManager() { return new MySQLTransactionManager(); }
}

创建型模式在架构中的应用

创建型模式解决对象创建问题,在架构中对应服务实例化和依赖注入。单例模式确保全局唯一实例,工厂模式解耦对象创建与使用,建造者模式处理复杂对象的分步构建。Spring框架的IoC容器就是工厂模式的典型实现,通过BeanFactory管理对象生命周期。

// 建造者模式 - 构建复杂配置对象
ServerConfig config = ServerConfig.builder()
    .host("0.0.0.0")
    .port(8080)
    .sslEnabled(true)
    .connectionPool(100)
    .timeout(Duration.ofSeconds(30))
    .build();

结构型模式在架构中的应用

结构型模式关注类与对象的组合。适配器模式用于遗留系统集成,代理模式实现远程调用和权限控制,装饰器模式为对象动态添加功能。微服务架构中,API网关就是代理模式的体现,统一处理认证、限流、日志等横切关注点。

# 适配器模式 - 统一不同数据源的访问接口
class DataAdapter(ABC):
    @abstractmethod
    def read(self, query: str) -> List[Dict]: ...

class MySQLAdapter(DataAdapter):
    def read(self, query: str) -> List[Dict]:
        return self.mysql_client.execute(query)

class MongoDBAdapter(DataAdapter):
    def read(self, query: str) -> List[Dict]:
        return self.mongo_client.find(query)

行为型模式在架构中的应用

行为型模式处理对象间的职责分配和通信。观察者模式是事件驱动架构的基础,策略模式支持运行时算法切换,命令模式实现操作的撤销和重放。CQRS模式本质上是命令模式与观察者模式的组合,将读写职责分离以优化各自性能。

// 观察者模式 - 事件驱动架构基础
interface EventObserver {
  handle(event: DomainEvent): void;
}

class EventBus {
  private observers = new Map<string, EventObserver[]>();
  
  subscribe(eventType: string, observer: EventObserver): void {
    const list = this.observers.get(eventType) || [];
    list.push(observer);
    this.observers.set(eventType, list);
  }
  
  publish(event: DomainEvent): void {
    const observers = this.observers.get(event.type) || [];
    observers.forEach(o => o.handle(event));
  }
}