싱글톤
// Logger 클래스 - 싱글톤
public class Logger {
private static final Logger instance = new Logger();
private Logger() {}
public static Logger getInstance() {
return instance;
}
public void log(String msg) {
System.out.println("[LOG] " + msg);
}
}
// UserService 클래스 - Logger에 강하게 결합
public class UserService {
private final Logger logger = Logger.getInstance(); // 직접 의존 (결합도 높음)
public void createUser(String name) {
logger.log(name + " 사용자 생성됨");
}
}
// Main
public class Main {
public static void main(String[] args) {
UserService service = new UserService();
service.createUser("홍길동");
}
}
---------------
// 인터페이스 정의
public interface Logger {
void log(String msg);
}
// 싱글톤 구현체
public class ConsoleLogger implements Logger {
private static final ConsoleLogger instance = new ConsoleLogger();
private ConsoleLogger() {}
public static ConsoleLogger getInstance() {
return instance;
}
@Override
public void log(String msg) {
System.out.println("[Console] " + msg);
}
}
// UserService 클래스 - 인터페이스에 의존
public class UserService {
private final Logger logger;
public UserService(Logger logger) {
this.logger = logger;
}
public void createUser(String name) {
logger.log(name + " 사용자 생성됨");
}
}
// Main
public class Main {
public static void main(String[] args) {
Logger logger = ConsoleLogger.getInstance(); // 여전히 싱글톤 사용
UserService service = new UserService(logger); // 느슨한 결합
service.createUser("홍길동");
}
}
결합도 낮추려면 생성자주입만으로 ㄱㅊ지만 개방폐쇄 완화시키기 위해서 인터페이스를 사용해야 기존코드 수정없이 사용가능