Design Pattern

    Decorator Pattern

    Decorator Pattern 란 객체의 결합을 통해 기능을 동적으로 유연하게 확장 할 수 있게 해주는 패턴 기본 기능에 추가할 수 있는 기능의 종류가 많은 경우에 각 추가 기능을 Decorator 클래스로 정의 한 후 필요한 Decorator 객체를 조합하여 사용하는 방식 구조 Component ConcreteComponent 과 Decorator 가 구현할 인터페이스다. 두 객체를 동등하게 다루기 위해 존재함 ConcreteComponent 기능 추가를 받을 기본 객체 Decorator 기능 추가를 할 객체는 이 객체를 상속받는다. ConcreteDecorator Decorator 를 상속받아 구현할 다양한 기능 객체이다. 이 기능들은 ConcreteComponent 에 추가되기 위해 만들어 진다...

    Composite Pattern

    컴포지트 패턴(Composite pattern)이란 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다. 객체 그룹과 하나의 객체가 동일한 행위를 할때 적용, 트리구조를 생성할 때 사용될 수 있다. 예시는 파일 시스템으로 1. Component Node라는 Component를 구성합니다. (equals와 hashcode는 Directory에서 remove시 객체의 내용이 같다면 삭제 되도록 하기 위해서 재정의 하였습니다.) import java.util.Objects; public abstract class Node { private String name; public Node(String name) { this.name..

    Bridge Pattern

    브리지 패턴(Bridge pattern)이란 구현부에서 추상층을 분리하여 각자 독립적으로 변형할 수 있게 하는 패턴이다. Abstraction 기능 계층의 최상위 클래스. 구현 부분에 해당하는 클래스를 인스턴스를 가지고 해당 인스턴스를 통해 구현 부분의 메서드를 호출합니다. RefindAbstraction 기능 계층에서 새로운 부분을 확장한 클래스 Implementor Abstraction의 기능을 구현하기 위한 인터페이스 ConcreteImplementor 실제 기능을 구현합니다. 기존에 참조하여 연습하는 사이트의 예시가 별로여서 검색후 적절한 예시를 가져왔씁니다. 위의 그림과 같이 인터페이스와 구현 모두에 인터페이스 계층 구조가 있다고 가정해보겠습니다. Shape의 구현체인 Triangle, Pent..

    Adapter pattern

    한 클래스의 인터페이스를 클라이언트에서 사용하고자하는 다른 인터페이스로 변환한다. 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있다. Mp3 지원하는 AudioPlater에서 Mp4와 Vlc를 지원하는 AdvancedMediaPlayer를 어댑터 패턴을 통해서 사용하는 것으로 AudioPlater의 play 메서드 실행시 Vlc, Mp4의 따라서 AdvancedMediaPlayer의 playVlc, playMp4 메서드가 실행되도록 하는 것이다. AdvancedMediaPlayer 모듈 public interface MediaPlayer { public void play(String audioType, String fileName); } public int..

    prototype pattern

    prototype pattern 원형이 되는 인스턴스를 사용하여 생성할 객체의 종류를 명시하고, 이렇게 만든 견본을 복사해서 새로운 객체를 생성합니다. object 생성이 높은 비용으로 수 많은 요청을 하는 경우, 또는 비슷한 object를 지속적으로 생성해야 할 때 유용하게 사용할 수 있다. prototype pattern은 본래의 object로 부터 새로운 object를 만들어내며(서로 다른 인스턴스), 각 객체에 따라 데이터 수정이 가능한 메커니즘을 제공 java의 clone()을 이용하기 때문에 생성하고자 하는 객체에 clone에 대한 Override를 요구합니다. 1. Shape 인터페이스 구현 - Cloneable을 상속받아서 clone을 오버라이딩 try catch을 통해서 익셉션을 바로 처..

    Builder Pattern

    Builder Pattern 빌더 패턴은 객체 생성을 깔끔하고 유연하게 하기 위한 기법 각 인자가 어떤 의미인지 알기 쉽다. setter 메소드가 없으므로 변경 불가능 객체를 만들 수 있다. 한 번에 객체를 생성하므로 객체 일관성이 깨지지 않는다. build() 함수가 잘못된 값이 입력되었는지 검증하게 할 수도 있다. public class NutritionFacts { private final int servingSize; private final int servings; private final int calories; private final int fat; private final int sodium; private final int carbohydrate; public static class B..

    Singleton Pattern

    Singleton Pattern 어떤 클래스의 인스턴스는 오직 하나임을 보장하며, 이 인스턴스에 접근할 수 있는 전역적인 접촉점을 제공하는 패턴 이점 객체를 재사용하기 때문에 메모리 낭비를 방지 싱글톤으로 생성된 객체는 무조건 한번 생성으로 전역성을 띄기에 다른 객체와 공유가 용이 단점 싱글톤으로 만든 객체의 역할이 간단한 것이 아닌 역할이 복잡한 경우라면 해당 싱글톤 객체를 사용하는 다른 객체간의 결함도가 높아져서 객체 지향 설계 원칙에 어긋나게 된다. (개방-폐쇄) 해당 싱글톤 객체를 수정할 경우 싱글톤 객체를 사용하는 곳에서 사이드 이팩트 발생 확률이 생기게 되며, 멀티 쓰래드환경에서 동기화 처리 문제등이 생길수 있다. public class SingleObject { private static S..

    Abstract Factory Pattern

    추상 팩토리 패턴 서로 관련이 있는 객체들을 통째로 묶어서 팩토리 클래스로 만들고, 이들 팩토리를 조건에 따라 생성하도록 다시 팩토리를 만들어서 객체를 생성하는 패턴 간단하게 생각하면 팩토리를 추상화 해서 교체하기 쉽게 만드는 패턴이라고 보면된다. 1. Shape 인터페이스 public interface Shape { void draw(); } 2. Shape를 상속받은 모형 구현 public class Rectangle implements Shape { @Override public void draw() { System.out.println("직사각형을 그렸습니다."); } } public class Square implements Shape { @Override public void draw() { ..