CS(Computer Science)/Design Pattern 5

옵저버 패턴

정의 상태를 가지고 있는 주체 객체 및 상태의 변경을 알아야 하는 관찰 객체 주제 객체와 상태 변경을 알아야 하는 관찰 객체가 존재하며 1 대 1 or 1 대 N 관계이고 다른 객체의 상태가 변경될 때마다 어떤 이벤트를 실행하고 싶을 때 사용된다. 인터페이스를 연결하여 느슨한 결합성을 유지하여 Publisher와 Observer 인터페이스를 적용한다. 주로 분산 이벤트 핸들링 시스템을 구현하는데 사용된다. 추가로 MVC(Model-View Controller)패턴에 자주 사용된다. 느슨한 결합성 두 객체가 상호작용을 하지만 서로에 대해서 잘 모른다는 것을 의미한다. 옵저버는 언제든지 추가할 수 있고, 주제와 옵저버는 서로 독립적으로 재사용할 수 있고, 서로한테 영향을 미치지 않는다. 즉, 변경 사항이 생..

팩토리 메소드 패턴

객체를 생성할 떄 어떤 클래스의 인스턴스를 만들 지 서브 클래스에서 결정하게되는 것 인스턴스 생성을 서브 클래스에게 위임한다. 팩토리 메소드 구조 팩토리 메소드 패턴 예시 Robot(추상 클래스) - SuperRobot - PowerRobot RobotFactory(추상 클래스) - SuperRobotFactory- ModifiedSuperRobotFactory # Robot이라는 클래스에서 RobotFactory에서 생성한다. RobotFactory 클래스 생성 public abstract class RobotFactory { abstract Robot createRobot(String name); } SuperRobotFactory 클래스 생성 public class SuperRobotFactory ..

템플릿 메소드 패턴

어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화해 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내역을 바꾸는 패턴 전체적으로는 동일하면서 부분적으로 다른 구문으로 구성된 메소드의 코드 중복을 최소화 할 때 유용하다. 구조 예제 // AbstractClass.java public abstract class AbstractClass { protected abstract void hook1(); protected abstract void hook2(); public void templateMethod() { hook1(); hook2(); } } // ConcreteClass.java public class ConcreteClass extends AbstractClass { @Over..

싱글톤 패턴

애플리케이션이 시작될 때, 어떤 클래스가 최초 한 번만 메모리를 할당하고 해당 메모리에 인스턴스르 만들어 사용하는 패턴 하나의 인스턴스만 생성하여 사용하는 디자인 패턴 생성자가 여러번 호출되도, 실제로 생성되는 객체는 하나이며 최초로 생성된 이후에 호출된 생성자는 이미 생성한 객체를 반환시키도록 만드는 것이다 (java에서는 생성자를 private으로 선언해 다른 곳에서 생성하지 못하도록 만들고, getInstance() 메소드를 통해 받아서 사용하도록 구현한다) 사용 이유 한번에 new 연산자를 통해 고정된 메모리 영역을 사용하기에 추후 해당 객체에 접근할 때 메모리 낭비를 방지할 수 있다. 메모리 측면에서 이득을 볼 수 있기 때문이다. 싱글톤으로 구현한 인스턴스는 '전역'이므로, 다른 클래스의 인스턴..

어댑터 패턴

코드를 재사용하기 위해 구조를 변경하는 패턴 사용 방법 : 상속 호환되지 않은 인터페이스를 사용하는 클라이언트 그대로 활용 가능 향후 인터페이스가 바뀌더라도, 변경 내역은 어댑터에 캡슐화 되므로 클라이언트가 바뀔필요가 없다. 기능상 문제없이 동작하는 코드가 단지 인터페이스 차이 때문에 사용할 수 없는 경우 많이 응용되는 패턴이다. 또한 기존 코드에 오류가 있거나 보정 작업이 필요한 경우에도 유용하다. 어댑터 객체 어댑터, 클래스 어댑터 클래스 어댑터 패턴 쓰려면 다중 상속이 필요, 자바에서는 다중 상속이 불가능 밑 그림과 같이 클래스 어댑터에서는 어댑터를 만들 때 타겟과 어댑터 모두의 서브 클래스로 만들고,객체 어댑터 에서는 구성을 통해서 어댑티에 요청을 전달한다는 점을 제외하면 별다른 차이점이 없다. ..