디자인 패턴(생성 패턴)

2023. 11. 7. 15:54java

디자인 패턴이란?

객체 지향 프로그래밍 설계과정에서 자주 발생하는 문제들을 피하기 위한 패턴이다.

 

생성 패턴

1. 팩토리

단일 책임 원칙을 지키기 위해 필요하다.

map 과 unit 클래스가 있을 때 map에 unit에 대한 책임이 있으면 안된다.

map class는 맵 파일로 맵을 구성하고 맵에 있는 unit들을 분류해서 적절하게 배치해야한다고 하자.

unit에 대한 책임이 없다는 건 unit이 추가되거나 할때 map class를 수정할 필요가 없는걸 뜻한다.

 

하지만 map을 정의하기 위해 unit과 관련된 내용이 포함 될 수 밖에 없다.(unit들을 분류해서 적절하게 배치)

이때 다른 추가 class를 만들어서 책임을 다른 클래스로 돌린다.(UnitFactory class)

그렇다면 Map은 맵 구성 , UnitFactory는 유닛 생성, Unit은 유닛 정의. 이렇게 각각의 기능만을 맡을 수 있게된다.

 

2. 빈즈 패턴

setter/getter 를 이용하여 객체를 생성하는 방법.

캡슐화를 위해 사용한다.

캡슐화 ?

서로 연관 있는 속성과 기능을 캡슐로 만들어 외부로 부터 보호한다.

직접 접근하지 못하게 하고 부가적인 기능을 거치게 하면서 개발자가 정보 노출 범위와 변경 가능성을 조절할 수 있도록 한다.

 

getter로 우리가 노출 범위를 설정할 수 있다.

4가지 변수(a, b , c, d)가 있을때 모두 private로 설정한다.

이때 우리가 사용자가 변수 c에 대해서만 값을 확인할 수 있도록 유도하고 싶다면 c에 대한 getter만 만들면 된다.

 

setter 로 변경 가능성을 조절할 수 있다.

final 로 변수들의 불변성을 확보한다면 내가 작성한 코드를 처음 본 사람이 해당 객체를 변경할 가능성이 없게된다.

처음 본 사람이 변수가 변하면 안되는지 모르고 그 부분을 건드린다면? 의도치 않은 결과가 생길 수 있다.

또한 해당 변수가 수정해도 되는 변수인지 하면 안되는 변수인지 코드를 확인해야하기 때문에 유지 보수에 더 많은 시간을

쓰게된다.

 

빈즈패턴은 이러한 setter과 getter를 이용해 객체를 만들고 setter로 초기화하는 방식을 말한다.

 

3. 점층적 생성자 패턴

필드 변수에는 필수적으로 기입되어야할 변수와 선택적으로 기입되어야할 변수로 구분 될 수 있다.

https://effortguy.tistory.com/4

필수 변수를 기점으로 점층적으로 초기화 시킨다.

하지만 매개변수가 늘어날수록 유지보수 비용이 매우 증가한다.

 

4. 빌더 패턴

생성자를 통해 직접 생성하지 않고 빌더라는 내부 static calss를 통해 간접적으로 객체를 생성.

 

방법(어노테이션으로 지원하지만 정석적 방법)

생성자를 private로 정의하고 빌더 클래스를 정의한 후 빌더를 통해 모든 변수에 대해 설정하고 build 함수로

생성자를 호출한다. 

 

왜 쓰는가?

유지 보수가 용이하다. 또 가독성이 좋아진다. 또 일관성과 불변성 문제를 해결할 수 있다.

 

예시

기존 방식들을 살펴보자.

점층적 생성자 패턴은 가독성이 안좋다. (몇번째 인자가 무엇을 의미하더라..?)

그래서 빈즈 패턴을 쓰려는데 일관성과 불변성이 보장되지 않는다.

setter를 모든 변수에 대해 쓰는 경우와 몇개 변수에 대해선 쓰지 않는 경우 일관성이 보장되지 않는다.

또 기껏 설정해도 setter로 바꿀 수 도 있으니 불변성에도 문제가 생긴다. 

 

그래서 자바 빈즈 패턴처럼 정보를 하나 하나 입력하지만 모든 정보가 모일 때 객체를 생성한다.

https://sudo-minz.tistory.com/133

 

5. 싱글톤 패턴

class Singleton {

    static final Singleton instance = new Singleton();

    private Singleton() {
        //초기화
    }

    public Singleton getInstance() {
        return instance;
    }

}



개발 과정에서 객체가 1개임을 보장하기 위한 방법. 모두 같은 객체를 사용해야할 때 final로 instance를 설정하고

이를 getInstance() 로 해당 클래스의 인스턴스를 얻는다.

 

단점 . 테스트하기가 너무 어렵고 객체지향 원칙을 위반

'java' 카테고리의 다른 글

우테코 3주차 소감문  (0) 2023.11.08
객체 지향 5원칙 SOLID  (0) 2023.11.07
stream 문법  (0) 2023.11.05
함수형 프로그래밍 , 람다식  (0) 2023.11.05
자바 Arrays.asList  (0) 2023.11.05