디자인 패턴 & 싱글톤 패턴

김주언·2022년 7월 13일

JAVA

목록 보기
9/10
post-thumbnail

1. 디자인 패턴

자주 사용하는 설계 패턴을 정형화하여 이를 유형별로 가장 최적의 방법으로 개발할 수 있도록 정해둔 설계
알고리즘과 유사하지만 명확한 정답이 있는 형태는 아니며 프로젝트의 상황에 맞추어 적용한다.

1.1 Gof 디자인 패턴

객체지향 개념에 따른 설계 중 재사용할 경우 유용한 설계를 디자인패턴으로 정리해둔 것
총 23개의 패턴이 있으며 생성패턴, 구조패턴, 행위패턴으로 구분 가능하다.

생성 패턴

객체를 생성하는 것과 관련된 패턴. 객체의 생성과 변경이 전체 시스템에 미치는 영향을 최소화하고 코드의 유연성을 높여준다.

  • 팩토리패턴
  • 싱글톤 패턴
  • 프로토타입 패턴
  • 빌더 패턴
  • 추상 팩토리 패턴
  • 체이닝 패턴

구조 패턴

프로그램 내의 자료구조나 인터페이스 구조 등 프로그램 구조를 설계하는데 활용될 수 있는 패턴

클래스, 객체들의 구성을 통해서 더 큰 구조를 만들 수 있게 해준다.

큰 규모의 시스템에서는 많은 클래스들이 서로 의존성을 가지게 되는데, 이런 복잡한 구조를 개발하기 쉽게 만들어주고 유지보수를 쉽게 해준다.

  • 어댑터 패턴
  • 컴포지트 패턴
  • 브릿지 패턴
  • 데코레이터 패턴
  • 퍼싸드 패턴
  • 플라이웨이트 패턴
  • 프록시 패턴

행위 패턴

반복적으로 사용되는 객체들의 상호작용을 패턴화한 것

클래스나 객체들이 상호작용하는 방법과 책임을 분산하는 방법을 제공한다. 행위패턴은 행위 관련 패턴을 사용하여 독립적으로 일을 처리하고자할 때 사용한다.

  • 템플릿 패턴
  • 인터프리터패턴
  • 이터레이터 패턴
  • 옵저버 패턴
  • 전략 패턴
  • 방문자 패턴
  • 연쇄책임 패턴
  • 커맨드 패턴
  • 중재자 패턴
  • 상태 패턴
  • 메멘토 패턴


싱글톤 패턴

어떤 클래스가 유일하게 하나만 존재할 때 사용한다.

주로 서로 자원을 공유할 때 사용한다. 실물 세계에서는 프린터를 생각하면 된다. 실제 프로그래밍에서는 TCP Socket 통신에서 서버와 연결된 connect 객체에 주로 사용한다. 또는 스프링의 빈

예제

SocketClient.java

package com.company.designPattern.singleton;

public class SocketClient {

    private static SocketClient socketClient = null;

    // default 생성자 막기
    private SocketClient() {
    }

    public static SocketClient getInstance() {

        if (socketClient == null) {
            socketClient = new SocketClient();
            System.out.println("socket new instance");
        }

        return socketClient;
    }

    public void connect() {
        System.out.println("socket");
    }

}

AClazz.java

package com.company.designPattern.singleton;

public class AClazz {
    private SocketClient socketClient;

    public AClazz() {
        this.socketClient = SocketClient.getInstance();
    }

    public SocketClient getSocketClient() {
        return socketClient;
    }

    public void setSocketClient(SocketClient socketClient) {
        this.socketClient = socketClient;
    }
}

BClazz.java

package com.company.designPattern.singleton;

public class BClazz {

    private SocketClient socketClient;

    public BClazz() {
        this.socketClient = SocketClient.getInstance();
    }

    public SocketClient getSocketClient() {
        return socketClient;
    }

    public void setSocketClient(SocketClient socketClient) {
        this.socketClient = socketClient;
    }
}

Main.java

package com.company.designPattern;

import com.company.designPattern.singleton.AClazz;
import com.company.designPattern.singleton.BClazz;
import com.company.designPattern.singleton.SocketClient;

public class Main {

    public static void main(String[] args) {
        AClazz aClazz = new AClazz();
        BClazz bClazz = new BClazz();

        SocketClient aClient = aClazz.getSocketClient();
        SocketClient bClient = bClazz.getSocketClient();

        System.out.println("두 객체는 동일한가?");
        System.out.println(aClient.equals(bClient));
    }
}

출력은 true


profile
학생 점심을 좀 차리시길 바랍니다

0개의 댓글