본문 바로가기

Knowledge/Design Pattern

(12)
스테이트 패턴 (State Pattern) 스테이트 패턴 (State Pattern)객체 내부 상태가 바뀜에 따라서 객체의 행동을 바꿀 수 있다.마치 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있다. 》》 상태 객체를 따로 생성하고, 상태 객체에게 위임하여 동작 ※ 스테이트 패턴의 예제천원짜리 지폐를 넣으면 100원짜리 동전 10개로 교환해주는 동전교환기가 있다.이 동전교환기를 어떻게 구현하는 것이 좋을까? 우선 동전교환기의 상태들을 모은다.이것을 상태에 따라 if문으로 구현한다면?디자인원칙 OCP를 지키지 못한다.객체지향 디자인이라고 보기엔 무리가 있다.지저분한 조건문으로 인한 가독성이 저하된다.무엇보다 추후에 발생하는 유지보수와 코드 확장의 어려움을 겪는다.그렇다면 어떻게 구현하는 것이 좋을까?먼저 동전교환기에 관련된 모든 행동의 메소..
이터레이터 패턴 (Iterator Pattern) 이터레이터 패턴 (Iterator Pattern) 컬렉션 구현방법을 노출시키지 않으면서도 그 집합체 안에 들어있는 모든 항목에 접근할 수 있게해주는 방법을 제공해준다. 》》 집합체내에서 어떤식으로 일이 처리되는지에 대해서 전혀 모르는 상태에서 그 안에 들어있는 모든 항목에 대해 반복작업 수행 가능》》 직접 Iterator 인터페이스를 만들 수도 있지만 자바에서는 Iterator 인터페이스를 제공한다. 이터레이터 패턴 예제음악사이트를 이곳 저곳 사용하다보니 여러 사이트에 플레이리스트가 흩어져있다.플레이리스트를 한 곳에 합쳐서 보고싶은데 어떻게 해야할까?각각의 플레이리스트를 단순하게 합쳐서 출력하려다보니까 각각의 사이트는 노래를 저장하는 방식이 달랐다.그러다보니 각각의 저장방식에 맞게 출력하려면 일일히 접근..
퍼사드 패턴 (Facade Pattern) 퍼사드 패턴 (Facade Pattern) 어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공한다.퍼사드에서 고수준 인터페이스를 정의하기 때문에 서브시스템을 더 쉽게 사용할 수 있다. 퍼사드 패턴과 유사한 데코레이터 패턴과 어댑터 패턴을 비교해보면...데코레이터 패턴 : 객체를 감싸서 새로운 행동을 추가어댑터 패턴 : 인터페이스를 변경해서 클라이언트에서 필요로 하는 인터페이스로 적응시키기 위한 용도퍼사드 패턴 : 어떤 서브시스템에 대한 간단한 인터페이스를 제공하기 위한 용도 퍼사드 패턴의 예제컴퓨터를 작동시키기 위해 우리는 단순히 전원버튼만을 누르지만 이것도 퍼사드 패턴의 예라고 볼 수 있다.실제로 전원을 키면 일어나는 작업은 한두가지가 아니다. ※ 만약 퍼사드 패턴이 적용되지 않은 컴퓨..
어댑터 패턴 (Adapter Pattern) 어댑터 패턴 (Adapter Pattern) 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환한다.어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있다. 》》 프로그램 세계에서는 이미 제공되어 있는 것을 그대로 사용할 수 없을 때 필요한 형태로 교환하고 사용하는일이 자주 있다. 》》 어댑터 패턴을 아이폰7과 이어팟에 비유해보자면...클라이언트 : 타겟 인터페이스에 맞게 구현되어있다.어댑터 : 타겟 인터페이스를 구현하며 여기에는 어댑티 인스턴스가 들어가있다.어댑티 : 어댑터에 의해 변환된 것을 받는다. 어댑터를 어떻게 사용하는걸까?1. 클라이언트에서 타겟 인터페이스를 사용하여 메소드를 호출함으로써 어댑터에 요청한다.2. 어댑터에서는 ..
커맨드 패턴 (Command Pattern) 커맨드 패턴 (Command Pattern) 요구사항을 객체로 캡슐화 할 수 있으며, 매개변수를 써서 다른 요구사항을 집어넣을 수도 있다.또한 요청내역을 큐에 저장하거나 로그를 기록할 수도 있고 작업 취소 기능도 지원 가능하게 한다. 》》 작업 요청을 객체의 형태로 캡슐화 하는 것이 가장 큰 목적이다.》》 즉, 커맨드 패턴을 사용하면 작업을 요청한 곳과 그 작업을 처리한 곳을 분리시킬 수 있다. ※ 커맨드패턴의 구조 클라이언트 : 커맨드 객체를 생성하고 인보커를 통해 리시버에 전달하여 요청한다.인보커 : 클라이언트의 커맨드 객체를 리시버에 전달한다.리시버 : 요청대로 특정 행동을 수행한다. 커맨드 : 어떠한 특정 행동을 담고 있는 추상 객체이다. 이를 식당에 비유하여 쉽게 설명하자면.... 클라이언트 -..
싱글톤 패턴 (Singleton Pattern) 싱글톤 패턴 (Singleton Pattern) 싱글톤 패턴은 해당 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하기위한 패턴이다. 》》 단 하나의 유일한 객체를 만들기 위한 디자인 패턴 여기서 중요한 것은 인스턴스가 단 하나만 만들어지고, 어디서든지 접근가능하게 한다는 점이다 !어디서 필요할까 ?정의를 살펴보면 알 수 있듯이 프로그램 상에서 객체가 하나만 필요할 때 사용된다.ex. 환경설정 관리 또는 로그관리, 동일한 DB커넥션 생성 → 여러 인스턴스가 존재할 필요가 없다!싱글톤 패턴 대신 전역 변수에 객체를 대입해서 사용해도 되지 않을까? 전역 변수에 객체를 대입하면 프로그램이 시작될 때 객체가 생성된다. 그런데 만약 프로그램이 끝날때까지그 객체를 한번도 쓰지 않..
추상 팩토리 패턴 (Abstract Factory Pattern) 추상 팩토리 패턴 (Abstract Factory Pattern) 추상 팩토리 패턴에서는 인터페이스를 이용하여 서로 연관된 또는 의존하는 객체를구상클래스를 지정하지 않고도 생산할 수 있다. 추상 팩토리 패턴을 이용해서 코드를 구성하면 클라이언트에서는 실제로 어떤 객체가 생산되는지 전혀 알 필요가 없게된다.이렇게 클라이언트와 객체 생성을 분리시키는 것을 추상 팩토리 패턴이라고 한다. 여기서 중요한 것은 인터페이스를 이용하여 생산한다는 점이다. 추상 팩토리패턴과 팩토리 메소드 패턴의 차이점은?두가지 패턴 모두 객체를 생성하는 일을 하지만,팩토리 메소드 패턴은 상속을 이용해서 객체를 생성하고, 추상 팩토리 패턴은 객체 구성을 이용하여 객체를 생성한다는 점이다.
팩토리 메소드 패턴 (Factory Method Pattern) TestClass test = new TestClassA(); 여기서 new는 무엇일까 ? new를 사용한다는 것은 구상 클래스의 인스턴스를 만들겠다는 뜻이다. 그렇다면 만약 다음과 같은 상황을 가정해보자. TestClass test; if(A){test = new TestClassA();}else if(B){test = new TestClassB();}else if(C){test = new TestClassC();}else if ..... 일련의 구상클래스들이 있을 때는 어쩔 수 없이 위와 같은 코드를 만들어야 하는 경우가 있다.이렇게 코드를 짜게되면 나중에 변경하거나 확장할 때 어려움을 겪는다. 문제가 "new"에 있는걸까?new 자체에 문제가 있는 것은 아니다. 문제가 있는건 바로 "변화" 때문.인..