在面向對象設計中,類之間的靜態關係是構建領域模型的基石。關聯、聚合、組合三者從鬆耦合到緊耦合遞進,準確區分它們對於表達業務語義、指導代碼實現至關重要。本文結合 UML 圖示、代碼範例與生命周期語義,為你徹底釐清三者的邊界。
定義:關聯是一種廣義的「有關」關係,表示一個對象知曉另一個對象,從而能發送消息或調用其方法。它是靜態結構關係,不涉及生命周期綁定。
class A {
private B itemB; // A 持有 B 的引用
}
class A {
void test(B b) { ... } // 僅在方法調用期間持有引用
}
- 局部變量創建/訪問
class A {
void foo() {
B b = new B(); // 局部引用
b.doSomething();
}
}
UML 表示:實線箭頭(或雙向無箭頭),可標註角色名、多重性(如 1, 0..*, 1..*)。
二、聚合 — 「Has-a」的弱整體-部分關係
核心語義:整體與部分擁有獨立的生命周期。整體銷毀時,部分對象可能繼續存活,可被其他整體共享。
經典案例:Person 與 Address
- 人「有」地址。
- 地址對象可獨立創建,傳入 Person 構造器。
- Person 銷毀後,Address 若被其他對象引用,不會被垃圾回收。
代碼實現
public class Address { /* ... */ }
public class Person {
private Address address;
public Person(Address address) { // 外部傳入,控制權在外部
this.address = address;
}
}
// 使用方式
Address addr = new Address();
Person person = new Person(addr);
// person 結束,addr 可能仍存活
UML 表示
空心菱形箭頭,菱形端指向整體。

三、組合 — 「Contains-a」的強整體-部分關係
核心語義:部分完全屬於整體,生命周期強綁定。整體創建時創建部分,整體銷毀時必須銷毀部分。部分不能被外部共享或獨立存在。
經典案例:Car 與 Engine
- 引擎是汽車的核心組成部分。
- 引擎在 Car 內部 new 出來,隨 Car 生命周期同生共死。
- 不存在「引擎被兩輛車共享」的業務邏輯。
代碼實現
public class Engine { /* ... */ }
public class Car {
private Engine engine = new Engine(); // 內部創建,控制權在內部
// 或在構造器中初始化
// public Car() { this.engine = new Engine(); }
}
// Car 實例被 GC,內部 Engine 引用計數歸零,隨之回收
UML 表示
實心菱形箭頭,菱形端指向整體。

四、對比總結表
維度 關聯 聚合 組合
耦合度 最弱 中等 最強
語義 知道/使用 擁有/包含 (弱) 組成/包含 (強)
生命周期 完全獨立 部分獨立於整體 部分依賴整體
共享性 可廣泛共享 可被多個整體共享 不可共享,專屬
創建方式 外部傳入/查找 外部傳入 內部實例化
UML 符號 實線箭頭 空心菱形 + 實線 實心菱形 + 實線
五、實戰判斷指南
- 問:部分能否脫離整體獨立存在? 是 → 聚合/關聯;否 → 組合。
- 問:部分是否可被多個整體同時共享? 是 → 聚合;否 → 組合。
- 問:整體是否負責部分的完整創建與銷毀? 是 → 組合;否 → 聚合/關聯。
- 問:只是單純的方法調用或臨時引用? 是 → 普通關聯。
結語
UML 建模的核心價值在於精準傳達設計意圖。不要為了畫圖而畫圖,而在代碼編寫前,先思考對象間的擁有權與生命周期契約:是「借用」(關聯)、「合夥」(聚合)還是「生死與共」(組合)。這種思維訓練,將直接提升你的領域建模與代碼架構能力。