Design Pattern 9

Abstract Factory

구체적 클래스에 의존하는 것이 아닌 서로 연관되거나 의존된 객체들의 조합을 만드는 인터페이스를 제공한다. 관련있는 객체들을 일관된 방식으로 생성하는 경우 유용 싱글톤, 팩토리 메서드 패턴을 사용한다. 일관된 방식으로 객체를 생성할 경우 요구사항이 늘어날 수록 팩토리 클래스가 늘어나는 것을 방지해준다. 추상화 된 Door 에서 상속 되어 나오는 벤더 제품을 만들고 있다. 공통기능은 템플릿 메서드로 획일화 시킨다. public abstract class Door { private DoorStatus doorStatus; public Door() { doorStatus = DoorStatus.CLOSED; } public DoorStatus getDoorStatus() { return doorStatus; }..

Design Pattern 2020.11.30

Builder

빌더 패턴도 객체 생성 패턴의 하나이다. 팩토리 패턴 : 하나의 Factory 메서드로 여러 객체를 만들어낸다. / 객체와 공장의 추상화와 이에 따른 구현클래스를 사용 ( 템플릿메서드와 함께 사용될 수 있다 ) 싱글톤 패턴 : 하나의 인스턴스 만을 생상하게 만든다. 프로토 타입 패턴 : new 연산자를 사용하지 않고 비용이 높은 ( DB 를 사용하는 등 ) 의 인스턴스 생성과 수정을 가볍게 한다. / 만들 객체의 추상화 과정과 Cloneable 을 이용한 객체 복사가 포인트이다. 빌더 패턴도 새로운 객체를 만드는 패턴이지만, 실제 동작방식은 차례대로 매개변수를 받아 변수를 통합시켜 객체를 만들어내는 방식이다. 사용하는 이유 복잡한 생성자를 만들어내어 사용자로 하여금 불편함을 주지않기 위함이다. 요구사항에..

Design Pattern 2020.11.29

Prototype - 깊은 복사와 얕은 복사, Cloneable

얕은 복사란 객체의 참조 값을 복사해오는 것을 보통 의미하는 것으로 알고있다. 원시 타입이라면 값이 대입되어 초기화된다. 참조 타입이라면 참조 값이 대입된다. 원본과 같은 참조 값을 가진다. 복사 본에 변경을 가하면 원본 객체에도 변화가 일어난다. 깊은 복사란 객체를 새로 생성하여 객체에 들어있는 값을 복사하는 것으로 알고 있다. 원시 타입이라면 값이 대입되어 초기화된다. 참조타입이라면 복사한 객체는 새로운 객체 이다. 멤버변수에 참조 타입이 있다면 해당 참조타입 또한 새로 만들어줘야한다. 이 변환 과정을 쉽게 보여주는 것이 Cloneable 인터페이스를 구현한 객체와 Cloneable 인터페이스를 구현하고 있는 배열이다. Java 에서는 객체 복사를 손쉽게 하기위해 clone() 메서드가 Object에..

Design Pattern 2020.11.29

Prototype

프로토타입 패턴이란 , 대략적인 샘플을 만드는 것이다. 객체를 생성할 때 비용이 많이 들거나. 비슷한 객체가 있는 경우 사용한다. 자바에서는 Cloneable 을 상속하거나 Object.clone 메서드를 사용하는 것으로 깊은 복사의 기능을 제공한다. 해당 패턴은 깊은 복사와 얕은 복사와도 관련이 깊다. 사용하는 이유 시스템이 어떤 생성 클래스를 사용하는지 가려준다. 어떻게 인스턴스를 만들고 결합하는지를 가려준다. new 연산자를 사용하는 것보다 clone() 을 사용하여 객체 생성의 수정점을 유연하게 가져가기위한 전략이다. 즉, 프로토타입 패턴에는 생성할 추상클래스가 선언된다. 추상클래스는 clone() 을 사용하기위해 Cloneable 인터페이스를 구현해야한다. 생성할 추상클래스를 구현하는 Concr..

Design Pattern 2020.11.29

SingleTon Pattern

스프링 프레임워크의 Bean 들은 기본적으로 SingleTon 의 Scope 를 가진다. 그러므로 스프링 빈 클래스에 멤버변수를 섵부르게 작성하면 Thread-Safe 하지 않음을 제대로 겪게 된다. Spring Container 가 Static Sharing Pool 이니까. 이렇게 알고 있는데, 그 싱글톤 패턴에 대해 알아본다. 사실 Jsp & Servlet 작업 당시 싱글톤을 써본적이 있다. 특징 static 키워드를 가지는 자기 자신의 클래스 변수 private 키워드를 가지는 생성자 static 키워드를 가지는 객체 생성 메서드 public class SingTonClass { private static SingTonClass singTonClass; private SingTonClass(){}..

Design Pattern 2020.11.24

Factory Method

템플릿 메서드를 사용하는 생성 메서드 패턴 모든 디자인 패턴의 목표는 구조와 구현의 분리에 있다. 객체 생성이 클래스 자신을 뜻하지 않아도 된다. 메서드 오버로딩 시 리턴타입은 영향을 주지 않는데, 팩토리메서드는 리턴 값이 다른 생성 메서드를 가질 수 있다. 내부에서 생성 과정이 여러가지 일 경우 Template Method 와 함께 사용될 수 있다. 객체를 만드는 추상클래스(Template Method, Factory Method) + 만들 객체의 인터페이스로 골격을 갖춘다. 추상클래스의 상속 클래스에서 만들 객체의 인터페이스의 구현체를 만들어내는 틀을 가진다. Product 인터페이스 / 구현 클래스 public interface Product { void use(); } class Corporati..

Design Pattern 2020.11.24

Template Method

공통적인 프로세스를 묶어주는 방법이다. 일정한 프로세스의 요구사항을 구현하는 방법이다. 유지보수와 확장성에서 이득을 보게 된다. 구현 로직의 일정한 단계를 거친다. 구현 로직의 변경 가능성이 크다. 로직을 여러 단계로 나눈다. 나눈 단계를 메서드로 선언한다. 나눈 단계를 수행하는 템플릿 메서드를 만든다. 하위 클래스에서 메소드를 구현한다. 가장 중요한 점은 단계를 나눈다는 것이고, 또 기존 프로세스 메서드를 외부에 노출시키지 않는 것이다. 보안, 인증, 인가, 접속 단계를 추상화 / 이를 진행하는 템플릿 메서드 선언 public abstract class AbstractProcessConnection { // 프로세스 메서드는 공개되지 아니한다. //보안 protected abstract String[]..

Design Pattern 2020.11.23

Adapter

호환되지 않는 인터페이스를 적응시켜 사용가능하도록 하는 방법이다. 이게 무슨 소린가 한참 생각해 봤는데 그러는 것보다 직접 코드 쳐서 이해하는게 빠르다는 것을 꺠달았다. 주목해야할 특징 Adapter 클래스는 클라이언트가 사용할 타입을 상속한다. 멤버변수로 적응시킬 인터페이스를 선언한다. Adapter 가 상속한 타입을 재정의하는 과정에서 멤버변수의 메서드를 호출한다. 결국 , 클라이언트가 원하는 인터페이스를 호출할 수 있지만, 기능은 적응시킬 인터페이스의 기능이 호출된다. FormatAdapter 가 MediaPlayer 로 프로모션 되어 사용되어질 수 있으며, 내부 메서드 호출은 MediaPackage 의 기능으로 호출된다. public interface MediaPlayer { void play(S..

Design Pattern 2020.11.23

Strategy

인터페이스를 이용한 추상화 와 다른 객체에 기능을 위임하는 델리게이트 를 사용한다. 즉, 하나의 기능(전략)에 대해서 추상화한 인터페이스를 이용한다. 인터페이스의 구현클래스를 이용하여 Target 에서 기능을 자유롭게 바꿔서 사용한다. ( 다형성 ) 중요한 점은 하나의 갈아끼울 전략을 정해놓고 추상화하는 것에 있어보임. Account 클래스에서 Todo 인터페이스를 필드로 사용하여 Todo 의 doSomething() 메서드를 호출하게 되어 있다. Interface 에 의한 추상화로 Strategy 를 잡는다. 다형성을 이용하여 다양한 부품을 끼워 넣는다. Todo를 의존하는 클래스에서 메서드 기능실행을 Todo 인터페이스 구현체에 위임한다. public class Main { public static ..

Design Pattern 2020.11.23