제어의 역전(Inversion of Control)
성격이 다른 책임이나 관심사는 분리해버려야 한다.
팩토리 : 객체의 생성 방법을 결정하고 그렇게 만들어진 오브젝트를 돌려주는 것
public Class DaoFactory {
public UserDao userDao() {
// 팩토리의 메소드는 UserDao 타입의 오브젝트를 어떻게 만들고, 어떻게 준비시킬지를 결정함
ConnectionMaker connectionMaker = new DConnectionMaker();
UserDao userDao = new UserDao(connectionMaker);
return userDao;
}
}
위와 같은 코드를 작성해주었기에 Test 클래스에서는 이제 해당 팩토리 클래스의 메소드만 호출하면 되도록 바뀌었다.
public class UserDaoTest {
public static void main(String[] args) {
UserDao dao = new DaoFactory().userDao();
}
}
여기서 만약 DaoFactory 에 UserDao 가 아닌 다른 Dao 의 생성 기능을 넣는 코드를 작성했다고 해보자.
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()
코드가 중복이 된다. 다음과 같이 분리해주자.
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();
}
}
이렇게 되면 ConnectionMaker 의 구현 클래스가 변경이 되어도 메소드 하나만 변경해주면 된다.
제어의 역전 : 간단히 프로그램의 제어 흐름 구조가 뒤바뀐 것
즉, 오브젝트가 자신이 사용할 오브젝트를 스스로 선택하지 않는다. 오직 위임받은 제어 권한을 갖는 특별한 오브젝트에 의해 결정되고 만들어진다.
반응형