Tv tv = new [ ] // [ ] 부분에 samsungTv, lgTv 등이 들어올 수 있을 것이다.
tv.channel++;
...
위와 같은 형태로 new로 객체를 생성하면 컴파일을 다시하는 것이기 때문에 작은 일은 아니다. 이 부분까지 고치지 않고 쓸 수 있는 방법을 생각했다. -> 공장이 인스턴스를 만들도록 한다.
// ex. 각각의 url에 따라 [ ]에 해당하는 servlet 클래스를 servlet 컨테이너가 만들어서 생성해서 준다.
// 따라서 [ ] 부분이 samsungTv에서 lgTv로 바뀌더라도 실제 코드가 달라지는 것이 아니다.
Tv tv = TvFactory.getTv([ ]);
tv.channel++;
인스턴스를 만들었다면 이제 우리가 써야한다. 사용하기 위해서는 객체를 받아와야 한다. 공장이 생성해준 객체를 어떻게 사용할 것인가? DI가 해당 객체를 주입받는 방법중 하나이다.
// DI가 적용안 된 예 (개발자가 직접 인스턴스를 생성한다.)
class 엔진{
}
class 자동차{
엔진 v5 = new 엔진();
}
// Spring에서 DI가 적용된 예
// 엔진 type의 v5변수에 아직 인스턴스가 할당되지 않았다.
// 컨테이너가 v5변수에 인스턴스를 할당해주게 된다.
@Component
class 엔진{
}
@Component
class 자동차{
@Autowired
엔진 v5;
v5.run(); // 바로 사용가능
}