factory
: 오브젝트를 생성하는 쪽과 생성된 오브젝트를 사용하는 쪽의 역할과 책임을 깔끔하게 분리하려는 목적으로 사용//UserDao의 생성 책임을 맡은 팩토리 클래스
package springbook.user.dao;
...
public class DaoFactory {
public UserDao userDao() {
ConnectionMaker connectionMaker = new DConnectionMaker();
UserDao userDao = new UserDao(connection); //UserDao 오브젝트 생성
return userDao
}
}
//팩토리를 사용하는 UserDaoTest
public class UserDaoTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
UserDao dao = new DaoFactory().userDao();
...
}
}
➡️ 오브젝트 팩토리를 활용한 구조
UserDao
: 애플리케이션의 핵심적인 데이터 로직ConnectionMaker
: 기술 로직DaoFactory
: 애플리케이션의 오브젝트들을 구성하고 그 관계를 정의하는 책임public class DaoFactory {
public UserDao userDao() {
return new UserDao(new DConnectionMaker());//반복됨
}
public AccountDao accountDao() {
return new AccountDao(new DConnectionMaker());//반복됨
}
public MessageDao messageDao() {
return new MessageDao(new DConnectionMaker());//반복됨
}
}
new DConnectionMaker
라는 ConnectionMaker 구현 클래스의 인스턴스를 만드는 부분이 반복됨//생성 오브젝트 코드 수정
public class DaoFactory {
public UserDao userDao() {
return new UserDao(connectionMaker());
}
public AccountDao accountDao() {
return new AccountDao(connectionMaker());
}
public MessageDao messageDao() {
return new MessageDao(connectionMaker());
}
public ConnectionMaker connectionMaker() {
return new DConnectionMaker();
}
}
일반적인 프로그램의 흐름
: 오브젝트 결정
-> 오브젝트 생성
-> 만들어진 오브젝트에서 메소드 호출
-> 그 오브젝트 메소드에서 다음에 사용할 것을 결정하고 호출
제어의 역전
: 오브젝트가 자신이 사용할 오브젝트를 스스로 선택하지 않음. 생성하지도 않음. 자신도 어떻게 만들어지고 어디서 사용되는지를 알 수 없음. 모든 제어 권한을 자신이 아닌 다른 대상에게 위임하기 때문.DaoFactory
에게 권한을 넘겨 UserDao
는 수동적인 존재가 됨 -> 제어의 역전