자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
자원을 직접 명시하면 유연성과 재사용성이 떨어진다.
public class EnglishNamingService {
public boolean isEnglishName(String name) {
return "English".equals(name);
}
}
public class KoreanNamingService {
public boolean isKoreanName(String name) {
return "한글".equals(name);
}
}
public class NamingUtils {
private static final KoreanNamingService koreanNamingService = new KoreanNamingService();
private NamingUtils() {}
public static boolean isValid(String name) {
return koreanNamingService.isKoreanName(name);
}
}
- NamingUtils에서 한글 네이밍 기능이 필요하지 않고 영어 네이밍 기능이 필요하다면 NamingService를 EnglishNamingService로 수정이 필요하다. (유연성이 떨어짐)
- 같거나 비슷한 기능이라도 isKoreanName, isEnglishName과 같이 메서드명이 다를 수 있기 때문에 NamingUtils의 코드를 수정해야한다. (재사용성이 떨어짐)
팩터리 메서드 패턴을 사용
public interface NamingService {
public int getLength(String name);
}
public interface NamingServiceFactory {
NamingService getNamingService();
}
public class EnglishNamingFactory implements NamingServiceFactory{
@Override
public NamingService getNamingService() {
return new EnglishNamingService();
}
}
public class KoreanNamingFactory implements NamingServiceFactory{
@Override
public NamingService getNamingService() {
return new KoreanNamingService();
}
}
public class FactoryNamingUtils {
private NamingService namingService;
public FactoryNamingUtils(NamingServiceFactory namingServiceFactory) {
namingService = namingServiceFactory.getNamingService();
}
public int getLength(String name) {
return namingService.getLength(name);
}
}
새로운 NamingService가 추가되더라도 팩토리를 사용하는 코드는 변경할 필요가 없다.
Spring IoC(Inversion of Control)
출처 : 백기선 이펙트브 자바 강의
'JAVA' 카테고리의 다른 글
| Effective Java finalizer와 cleaner 사용을 피하라 (0) | 2023.04.20 |
|---|---|
| Effective Java 불필요한 객체 생성을 피하라 (1) | 2023.04.17 |
| Effective Java 싱글턴 part2. (feat. 메서드 참조, 함수형 인터페이스, 직렬화) (1) | 2023.04.11 |
| Effective Java 싱글턴 (1) | 2023.04.10 |
| Effective Java 빌더 (0) | 2023.04.07 |