자바

자주쓰는 디자인 패턴 총정리 (생성 패턴 편)

류창 2023. 3. 21. 20:12
반응형

 

1. 추상 팩토리 패턴

 

많은 수의 연관된 서브 클래스를 특정 그룹으로 묶어 한번에 교체할 수 있도록 만들었다.

 

예시)

 

중국 요리, 한국 요리가 있다.   이 요리는 Cook()라는  공통점이있다. 

 

비슷한 두 클래스끼리 하나의 그룹으로 묶어 표현하고싶다!

 

 

Food( Interface )

ChinaFood(Class)

KoreanFood(Class)

 

 

엥.. 그냥..   Interface(인터페이스) 또는 Abstract Class(추상 클래스) 를 상속해서 쓰는 건가..?

 

이것만 놓고보면 그렇다. 

 

하지만, 대부분 다음에 소개할  팩토리 메소드와 연계해서 사용한다. 

 

 

 

2. 팩토리 메소드 패턴  (Factory Method)

 

객체를 만들어 반환하는 함수를 (생성자 대신) 제공하여 초기화 과정을 외부에서 보지 못하게 숨기고 반환 타입을 제어하는 방법.

 

예시를 한번 봅시다.

FoodFactory (Class)

 

Main(Class) 

 

 

Main 클래스를 보면,  팩토리 메소드 패턴의 설명이 이해가 갑니다.

 

FoodFactory의 클래스를 만들어서,

 

createFood2() 라는 객체를 만들어 반환하는 함수를 (생성자 대신) 제공하여

초기화 과정을 외부에서 보지 못하게 숨기고 

반환 타입을 제어  (KoreanFood)

 

 

 

아까 말씀햇듯이,  1번의 추상 팩토리와 2번 팩토리 메소드를 연계해서 사용했습니다.

 

두 패턴을 합쳐서 사용하면 좋은점은 여기서옵니다.

 

 Main 클래스는  Interface인 Food만 알면 된다.

 

Food로 (추상적팩토리패턴) 비슷한 요소를 묶어,  Factory로  (팩토리 메소드 패턴)  Food에만 접근

 

만약 추상적 팩토리 패턴을 안쓴다면,  메인은 늘  중식, 한국, 양식 , 베트남식....

수많은 요리들을   "의존" 해야만 할것이다.

 

하지만, 추상적 팩토리 패턴으로  하나의 키워드 (Food)만 알고 있다면

 

Factory에게  Food + "한국" 의 단서를 주면  내가 실제로, KoreanFood를 의존을 안해도 

Factory가  던져주는 형식이다. 

 

 

그래서 이게 왜 좋은건데??

 

1. 단일 책임 원칙 

 

메인 클래스 즉, 손님은 책임이 있다라고 생각해보자

 

만약 Factory의 존재가없다면,  손님은 당장 한국요리를  갖고싶은데,

손님이 중식..한식.. 양식.. 베트남식..  전부 둘러보면서 이게 한식인지 일일이 판별해야 하는 책임을 갖는다.

 

손님은 매우바쁜사람이다.  일일이, 공장가서 요리들 다 둘러볼시간 없다는것이다.

 

=>따라서 Factory의 존재로 책임을 줄여주는것이다.

 

 

2. 개방 폐쇄 원칙 

 

확장에 대해서는 개방적(open)이고, 수정에 대해서는 폐쇄적(closed)이어야 한다는 의미로 정의한다.

  

이 원칙을 잘 수행할수 있게된다.

 

 

확장에 대해서는 개방적(open)이고

 

Food에서 양식(미국 요리)을 추가하려고한다.

 

즉, Food를 확장하는 개념이다.   미국요리를 추가하기위해  Food를 받는다.

 

Food에 이미 개발된 내용이나, 규격이 있기때문에 확장하기 편하다.

 

 

수정에 대해서는 폐쇄적(closed)이어야 한다.

 

여기서 수정에대해서는 폐쇄적이다 라는 부분은 저 노란색부분이다.

 

만약, 이 FoodFactory를  10개가 넘는곳에서 쓴다고 가정하자.

이 패턴을 사용하지않는다면,  우린 저 노란부분을 10개가 넘는곳에 수정작업을 들어가야한다.

 

EX)  Food ->  KoreanFood, AmericanFood, ChinaFood... 등등

 

Q) 아니,  그렇게 따지면 파란색줄도 수정이잖아!!  양식레시피를 받으려면  "미국" 으로 바꿔야하는거 아닌가요?

설명을 위해서 간편하게 만든 예제라서 그런겁니다.  실제로는 저 파란부분은 Type 이라는 변수를 넣고,

클라이언트측에서 받은 변수값에따라 조절합니다.

 

ex )   foodFactory.createFood2( typeName);

 

즉,  이 방법을 쓰면  main은 손댈부분이 전혀 없어집니다!

 

 

 

3. Builder 패턴

 

객체를  Build해주는 패턴이다. 

즉, 객체를 아주 쉽게 생성하고 , 수정할때는 엄청 편하게 수정해주는 패턴이다.

 

Builder 패턴 안쓴 방법  (생성자 메소드)

 

Member 객체를 인스턴스화 하기위해,  

 

Member  member  =  new Member (name, address);  코드를 입력해야 할것이다.

 

Bulider 사용 버전

다음 코드는  Lombok 라이브러리를 사용한 버전이다.

 

Member 객체를 사용하기위해서는,

 

Member member = Member.builder().name("철수").address("서울").build();

이 코드를 작성해야한다.

 

 

Builder 패턴의 장점

 

1. 파라미터를 쉽게 누락시킬수있다.

 

-> address 주소를 지금  입력받고싶지않다면 다음과같이 할수있다.

 

Member member = Member.builder().name("철수").build();

 

2. 파라미터 순서가 달라도된다.

 

 

3.파라미터 변경사항이 일어나도, 문제가 발생할 경우가 적어진다.

 

member에 추가로 나이가 들어가도, 당장 컴파일하는데 문제는 생기지않는다.

(설정안하면 null값)

 

 

 

4. 프로토타입 패턴

 

원본(Prototype)을 만들어 놓고 원본 객체를 복사하여 사용하는 방식.

 

Java에선 이를  clone() 메소드를 사용하여 구현한다.

 

 

ProtoType 원본

 

원본을 복사하며 쓰기

 

 

프로토타입 패턴을 쓰는이유는,

DB에서 동일한 데이터를 조회하는 행위(같은 객체를 여러개 생성)가 여러번 중복되는것이  염려가 될때,

뽑아온 데이터를 clone()하여  효율성을 줄이는 방법이다.

 

 

 

5. 싱글톤 패턴

 

https://taehoung0102.tistory.com/73

 

스프링(Spring): 싱글톤(Singleton) 패턴

이번 포스팅은 디자인패턴 중 하나인 싱글톤 패턴에대해 다뤄보겠습니다. 싱글톤 패턴(Singleton Pattern)은 무엇일까? 위키피디아: 싱글턴 패턴(Singleton pattern)을 따르는 클래스는, 생성자가 여러 차

taehoung0102.tistory.com

 

반응형