Java/자바 디자인 패턴

    어댑터 패턴 (Adapter Pattern) 이란?

    어댑터 패턴 (Adapter Pattern) 이란?

    어댑터 패턴 (Adapter pattern) 현실 세계에서도 찾아보기 쉬운 패턴이다. 해외에서 한국의 전자제품을 사용하려면 110v '어댑터'를 가져가야 한다. 호환되지 않는 인터페이스를 가진 객체들이 협업할 수 있도록 해주는 구조적 디자인 패턴이다. 클라이언트가 사용하는 인터페이스를 따르지 않는 레거시 코드를 재사용할 수 있게 해준다. 다이어그램으로 어댑터 패턴 관계 살펴보기 각 클래스에 대한 설명은 아래와 같다. Target 은 변화에 대한 요구사항이다. Adaptee 는 기존의 코드이다. Adapter 는 변화에 대한 요구사항을 구현한 새로운 코드이다. Adaptee 가 가지고 있는 기능을 Adapter 가 주입받아 operation() 을 구현한다. Client 는 인터페이스인 Ta..

    프로토타입 패턴 (Prototype Pattern) 이란?

    프로토타입 패턴 (Prototype Pattern) 이란?

    프로토타입 패턴 (Prototype Pattern) 기존의 인스턴스를 복제하여 새로운 인스턴스를 만드는 방법이다. 클래스에 의존하지 않으면서도, 기존 객체를 복제하게 해준다. 실제로 복제되는 객체에 복제 프로세스를 위임한다. 복제를 지원하는 객체를 프로토타입 이라고 하기도 한다. 프로토타입 패턴이 해결하는 문제 객체 복사는 쉬워보이는데 왜 프로토타입 패턴이 필요할까? 비공개 필드가 있는 경우 생각보다 쉽지 않다. 클라이언트 입장에서는 인터페이스만 알고, 구현체에 대해 모를 수도 있어서 생각보다 복사하기 까다로울 수 있다. 많은 상속을 통해 다양한 필드를 늘려온 객체의 경우 필드 값을 복제하는 일이 생각보다 쉽지 않다. 프로토타입 레지스트리를 사용하면, 설정이 복잡하지만 자주 사용되는 객체를 어디 저장해두..

    빌더 패턴 (Builder Pattern) 이란?

    빌더 패턴 (Builder Pattern) 이란?

    빌더 패턴이란? 객체 생성에 연관된 패턴이다. 복잡한 객체들을 단계별로 생성할 수 있게 만들어 복잡도를 줄여준다. 동일한 프로세스를 거쳐 다양한 구성의 인스턴스를 만드는 방법을 제공한다. 해결하려는 문제 객체에 아주 많은 필드가 들어있어 복잡할 때 객체 생성이 어려운 문제가 있다. 생성자에 필드를 몰아놓으면 처음 객체를 생성하기가 매우 어렵다. Setter 를 이용하려고 하면, 필수값과 연계값 등 제약조건을 넣기 힘들다. 복잡한 객체를 생성할 때 빌더 패턴을 사용하면 조금 더 쉽게 생성할 수 있다. 빌더 패턴 다이어그램으로 살펴보기 복잡한 Product 를 만드는 경우, Builder 에 추상 메서드를 추가하고, ConcreteBuilder 가 이를 구현하도록 위임하여 복잡한 객체를 만드는 프로세스를 독..

    추상 팩토리 패턴 (Abstract Factory Pattern) 이란?

    추상 팩토리 패턴 (Abstract Factory Pattern) 이란?

    추상 팩토리 패턴이란? 서로 관련된 여러 객체를 만들어주는 인터페이스를 제공하고 이를 구현하는 패턴 관련이 깊은 여러 종류의 객체를 일관된 방식으로 생성하는 경우에 유용하다. 팩토리 메서드 패턴 과 굉장히 비슷하다. 팩토리 메서드 패턴 은 하나의 객체 생성을 어떻게 할까에 집중하는 반면, 추상 팩토리 패턴은 관련 있는 여러 객체를 묶어 여러 구체적 클래스에 의존하지 않는 것에 집중한다. 다이어그램으로 살펴보기 AbstractFactory 는 CreateProductA() 와 CreateProductB() 라는 추상 메서드를 제공한다. ProductA 와 ProductB 를 생성한다. 구체적인 객체 생성 방법의 구현은 하위 클래스에게 맡긴다. ConcreteFactory1 과 ConcreteFactory2..

    팩토리 메서드 패턴 (Factory Method Pattern) 이란?

    팩토리 메서드 패턴 (Factory Method Pattern) 이란?

    팩토리 메서드 패턴이란? 객체 생성 패턴의 한 종류이다. 팩토리 패턴은 객체 생성 역할을 별도의 클래스에 넘기는 패턴을 말한다. 객체 생성 책임을 구체적인 클래스가 아닌 추상 메서드에 넘긴다. 인터페이스나, 추상 클래스로 구현이 가능하다. 다양한 팩토리 클래스를 만들어 객체 생성 추상 메서드를 구현할 수 있다. 다이어그램으로 살펴보기 Creator 는 factoryMethod() 라는 추상 메서드를 가지고 있다. Product 타입의 객체를 반환한다. factoryMethod() 는 추상 메서드인만큼 누군가 구현해주어야 한다. Creator1 은 Creator 의 구현체이다. 추상 메서드였던 factoryMethod() 를 구현했다. Product1 은 Product 의 구현체로 Product 를 상속한..

    싱글톤 패턴 (Singleton Pattern) 이란?

    싱글톤 패턴이란? 클래스의 인스턴스를 오직 하나만 두고 사용하는 패턴이다. 1개 외에 추가적인 인스턴스 생성을 의도적으로 막아야 한다. 용례 애플리케이션의 구성(configuration) 정보와 같이 런타임 내에 공유되어야 하는 정적인 정보를 가지고 있는 클래스의 인스턴스를 만들 때 이 패턴을 사용할 수 있다. 생성 비용이 큰 인스턴스가 있을 때, 이 인스턴스를 한번 만들고 계속 재활용이 가능하다면 이 인스턴스를 싱글톤으로 공유하는 것을 생각해볼 수 있다. 자바에서의 나이브한 싱글톤 구현 public class SingletonClass { private static instance; private SingletonClass() { // 생성자를 private 으로 만들면, 외부에서 생성자 호출이 불가능..

    자바 믹스인(mixins)이란?

    믹스인이란? 객체지향언어에서 다른 클래스에서 '사용'할 목적으로 만들어진 클래스이다. '포함'으로 설명된다. '상속'과 주로 비교되는 개념이다. (is-a vs has-a) Composition 혹은 Aggregation 이라고 불리기도 한다. 코드 재사용성을 높여주고, 상속의 단점을 해결할 수도 있다. 자바코드에서는 다중 상속의 제한이 없는 인터페이스로 구현하기 용이하다. 대상 타입의 주된 기능에 선택적 기능을 '혼합(mixed in)'한다고 해서 믹스인이라 불린다. 예제 코드 public interface Singer { AudioClip sing(Song s); } public interface Songwriter { Song compose(..

    제네릭 싱글턴 팩토리

    제네릭 싱글턴 팩토리란? public class GenericFactoryMethod { public static final Set EMPTY_SET = new HashSet(); public static final Set emptySet() { return (Set) EMPTY_SET; } } 제네릭으로 타입설정 가능한 인스턴스를 만들어두고, 반환 시에 제네릭으로 받은 타입을 이용해 타입을 결정하는 것이다. 예제 코드 @Test public void genericTest() { Set set = GenericFactoryMethod.emptySet(); Set set2 = GenericFactoryMethod.emptySet(); Set set3 = GenericFactoryMethod.emptySet..

    플라이 웨이트 패턴

    플라이웨이트 패턴(flyweight pattern)이란? 정적인 저장소를 만들어 놓은 뒤에 여러 클래스에서 공용으로 사용할만한 것을 저장해놓고 갖다 쓰는 것을 플라이웨이트 패턴이라고 한다. 실생활에 비유하자면, 마트에서 여러가지 종류의 라면을 미리 사서 주방 찬장에 넣어놓으면 마트에 다녀올 필요가 없는 것과 비슷하다. 실제 사용 예로 자바의 스트링 풀이 있다. @Test public void flyWeightPattern() { String s = "hello"; String s1 = new String("hello"); String s2 = "hello"; System.out.println("s == s1 ? " + (s == s1)); // true System.out.println("s == s2 ..

반응형