はじめに
・集約とコンポジションの違いがよくわからなかったので自分なりに調べて、コードを実装し試してみた
集約
ChatGPTの回答
・集約は、「部分と全体」の関係を表現します。つまり、オブジェクト間の関係が「has-a」の形を取ります。
・集約では、部分オブジェクトがそのまま独立して存在できます。つまり、全体オブジェクトが破棄されても、部分オブジェクトは依然として存在し得ます。
実装例
sample.java
public static void main(String[] args) {
Tire tire = new Tire();
Engine engine = new Engine();
Car car = new Car(tire, engine);
car = null;
// carがnullになってもTireクラスとEngineクラスは生きている
System.out.println(tire);
System.out.println(engine);
}
class Car {
private Tire tire;
private Engine engine;
public Car(Tire tire, Engine engine) {
this.tire = tire;
this.engine = engine;
}
// 省略
}
class Tire {
public void haveTire(string kind) {
System.out.println("4 Tires")
}
}
class Engine {
public void start() {
System.out.println("Engine Start")
}
}
全体オブジェクトであるCarクラスを破棄しても、TireクラスやEngineクラスは別でインスタンスを作っているため存在している
コンポジション
ChatGPTの回答
・コンポジションもまた、「部分と全体」の関係を表現しますが、より強い関連性を持ちます。つまり、オブジェクト間の関係が「contains-a」の形を取ります。
・コンポジションでは、部分オブジェクトは全体オブジェクトに依存しており、全体オブジェクトが破棄されると部分オブジェクトも同時に破棄されます。
sample.java
public static void main(String[] args) {
Car car = new Car();
car = null;
// carがnullになってたらTireクラスとEngineクラスは無くなっている
}
class Car {
private Tire tire;
private Engine engine;
public Car() {
this.tire = new Tire();
this.engine = new Engine();
}
// 省略
}
class Tire {
public void haveTire(string kind) {
System.out.println("4 Tires")
}
}
class Engine {
public void start() {
System.out.println("Engine Start")
}
}
集約とコンポジションの違い
CarクラスがEngineクラスとTireクラスを使っているのは同じ
使っているCarクラスでnullとかになった場合、使われているTireクラスやEngineクラスで生きているかどうかで集約かコンポジションになる