디자인 패턴 - (2) 생성 패턴

박영준·2023년 1월 11일
0

Java

목록 보기
38/111

1. '생성 패턴' 이란?

  • 객체 생성에 관련된 패턴

  • 객체의 생성과 조합을 캡슐화하여
    특정 객체가 생성/변경 되어도
    프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공

    참고: 캡슐화, 접근 제한자

2. 종류

1) 추상 팩토리 (Abstract Factory)

  • 구체적인 클래스에 의존하지 않고,
    인터페이스를 통해 서로 연관, 의존하는 객체들의 그룹으로 생성하여 추상적으로 표현

  • 연관된 서브 클래스를 묶어, 한 번에 교체하는 것이 가능

  • 동일한 주제의 다른 팩토리를 묶어 준다.

2) 빌더 (Builder)

참고: 점층적 생성자 패턴 vs 자바빈즈 패턴 vs 빌더 패턴

3) 팩토리 메서드 (Factory Method)

  • 객체 생성을 서브 클래스에서 처리하도록 분리하여 캡슐화한 패턴

  • 상위 클래스에서 인터페이스만 정의하고, 실제 생성은 서브 클래스가 담당
    --> 가상 생성자(Virtual Constructor) 패턴이라고도 한다.

  • 생성할 객체의 클래스를 국한하지 않고 객체 생성

4) 프로토타입 (Prototype)

  • 원본(기존) 객체를 복제하는 방법으로 객체를 생성하는 패턴

  • 일반적인 방법으로 객체를 생성

  • 비용이 큰 경우 주로 이용

5) 싱글톤 (Singleton)

(1) 정의

  • 어떤 클래스 내에서 하나의 인스턴스(객체)만 존재하도록 제한하며, 이 인스턴스에 접근할 수 있는 전역적인 접촉점을 제공하는 패턴

  • 어플리케이션의 시작부터 끝까지, 특정 클래스의 인스턴스는 메모리 상 단 한개만 존재하고,
    이 인스턴스에 대해 어디서나 접근할 수 있도록 하는 패턴

  • 전체 프로그램에서 단 1개의 객체만 만들어야 한다.
    --> 이를 위해, 클래스 외부에서 new 연산자로 생성자 호출하는 것을 막아야 한다.

참고: this, static, final - 2. static

(2) 사용 목적

  • 어플리케이션을 개발하다보면, 특정 클래스의 인스턴스가 1개만 있는게 좋을 때가 있다.

    예시
    설정이라는 클래스가 있다고 가정하자.
    사용자가 설정을 변경할 때마다 설정 인스턴스가 생성이 되면
    전역적인 성질을 가지고 있는 설정이라는 객체의 의미가 없어지게 된다.

    주의점
    하나의 객체를 생성하면 생성된 객체를 어디서든 참조할 수 있지만,
    여러 프로세스가 동시에 참조할 수는 없다.

  • 값에 불변성을 주기위해

  • 리소스 낭비를 줄이기 위해

(2) 예시

private(같은 클래스 내에서만 접근 가능) 접근 제한자를 사용하면 된다.

Car.java

public class Car {

    //정적 필드 선언+ 객체 생성(초기화를 위해)
        //private: private 접근 제한자를 붙여 생성자를 만듦 --> 외부에서의 생성을 막음
        //bus: 새로운 객체 생성
        //private static Car = bus = new Car(); 이라는 뜻
    private static Car bus = new Car();

    //생성자
    //외부에서 호출하지 못하게 private 으로 지정
    private Car() {

    }

    //정적 메소드
    //getInstance(): 외부에서 객체를 얻는 유일한 방법
        //어떻게?  단 1개의 객체만 리턴하기 때문
        //이렇게 하면, 외뷔에서 getInstance() 메서드를 사용하지 않고는 객체 Car 을 사용할 수 없게된다
    static Car getInstance() {
        return bus;		//객체 bus 를 반환
    }
}

CarExample.java

public class CarExample {
    public static void main(String[] args) {

        Car obj1 = new Car();   //컴파일 에러
        Car obj2 = new Car();   //컴파일 에러

        Car obj1 = Car.getInstance();
        Car obj2 = Car.getInstance();
    }
}

프로젝트가 실행이 될 때 딱 등록되는 값의 경우에도 사용.
--> 내부 로직이 변하면 안 되기 때문

참고: 캡슐화, 접근 제한자

(3) 장단점

참고: 운영체제 (OS)

(4) 주의점

  • stateless 하게 설계해야한다

  • 내부에 값을 변경할 수 없어야하며(불변성) 의존적인 전역 필드가 있으면 안된다.

  • Thread 끼리 공유하지 않는 지역변수, 파라미터, ThreadLocal 을 사용해서 작성해야한다.

    참고: stateful 과 stateless
    참고: 운영체제 (OS)


참고: 디자인 패턴 - 생성 패턴
참고: 디자인 패턴(Design Pattern)이란?
참고: Telescoping Constructor Pattern이 뭐야
참고: JavaBeans Pattern이 뭐야
참고: 이펙티브 자바 02. 점층적 생성자 패턴, 자바빈 패턴, 빌더 패턴
참고: [Java] Builder pattern (빌더 패턴, 점층적 생성자 패턴, 자바빈 패턴)
참고: 싱글톤(Singleton) 패턴이란?
참고: 빌더 패턴(Builder pattern)을 써야하는 이유, @Builder

profile
개발자로 거듭나기!

0개의 댓글