의존성을 가지고 있다는 것
public class PhoneUser {
// Has a 관계 발생
SPhone phone;
// 직접 객체 생성
public PhoneUser() {
phone = new SPhone();
}
}
위 코드를 보면 PhoneUser는 SPhone를 사용하기 위해 이를 멤버 변수로 선언하고 사용한다. 이 것이 has a 관계이다.
이 때, SPhone을 PhoneUser의 의존성이라고 하고 PhoneUser는 SPhone에 의존하고 있다고 한다.
근데 만약 위의 코드에서, 우리가 휴대폰을 변경해서 LPhone으로 변경해야 한다고 하자.
public class PhoneUser {
// 의존관계의 변경
LPhone phone;
// 직접 객체 생성
public PhoneUser() {
phone = new LPhone(); // 생성되는 객체 변경 필요
}
}
interface 활용
public class PhoneUser {
// 의존관계의 변경
SmartPhone phone; // has a 대상을 인터페이스로 변경
// 직접 객체 생성
public PhoneUser() {
phone = new LPhone(); // 구현체가 변경되면 여전히 코드 수정 필요
}
}
Factory Pattern의 적용
public class PhoneFactory {
public static SmartPhone getPhone(String maker) {
if(maker.equalsIgnoreCase("s") {
return new SPhone();
} else {
return new LPhone();
}
}
}
public class PhoneUser {
private SmartPhone phone;
public PhoneUser(SmartPhone phone) { // 생성자를 이용한 주입
this.phone = phone;
}
public void setPhone(SmartPhone phone) { // setter을 이용한 주입
this.phone = phone;
}
public SmartPhone getPhone() {
return this.phone;
}
}
💡 하지만 위와 같은 Factory Pattern은 너무 복잡하다
DI를 통한 의존성 주입
public class PhoneUser {
private SmartPhone phone;
public PhoneUser(SmartPhone phone) {
this.phone = phone;
}
}