디자인 패턴

서지우·2023년 7월 25일

개발지식

목록 보기
5/7

디자인 패턴

디자인 패턴은 프로그램을 개발하는 과정에서 빈번하게 발생하는 디자인 문제를 정리해서 상황에 따라 간편하게 적용할 수 있게 정리한 것이다. 잘 활용할 수만 있다면 적지 않은 시간과 노력, 시행착오를 줄일 수 있다.

우리 앞에 놓여진 것과 비슷한 문제를 해결하려고 선배들이 시간과 노력을 투자해서 이것저것 시도해 보고, 그중에서 가장 효과적이라고 알려진 방법이 ‘패턴’이라는 이름으로 자리를 잡았기 때문이다.

몇 가지 범주에 맞춰서 디자인 패턴을 분류하고 있다. 그중 제일 유명한 분류 방법은 생성, 행동, 구조라는 3가지 범주로 용도에 따라 나누기다.


생성 패턴(Creational Pattern)

객체 인스턴스를 생성하는 패턴으로, 클라이언트와 그 클라이언트가 생성해야 하는 객체 인스턴스 사이의 연결을 끊어 주는 패턴이다.


싱글턴 패턴(Singleton Pattern)

- 특정 클래스에 객체 인스턴스가 하나만 만들어지도록 해주는 패턴 
- 싱글턴 패턴을 사용하면 전역 변수를 사용할 때와 마찬가지로 객체 인스턴스를 어디서든지 액세스 할 수 있게 만들 수 있음 
- 클래스 인스턴스를 하나만 만들고 그 인스턴스로의 전역 접근을 제공

package ch00;

// 싱클톤
class Sun{
    //생성자를 private로 만들어서 new를 막는다.
    private Sun() {};

    private static Sun sun = null;

    public static Sun getSun(){
        if (sun == null) {
            // 객체를 한번만 생성

            sun = new Sun();
        }
        return sun;
    }
}

public class Study12 {
    public static void main(String[] args) {
        System.out.println(Sun.getSun());
        System.out.println(Sun.getSun());
        System.out.println(Sun.getSun());
        System.out.println(Sun.getSun());
        System.out.println(Sun.getSun());
        System.out.println(Sun.getSun());
        System.out.println(Sun.getSun());
    }
}

추상 팩토리 패턴(Abstract Factory Pattern)

- 구상 클래스에 의존하지 않고도 서로 연관되거나 의존적인 객체로 이루어진 제품군을 생산하는 인터페이스를 제공 
- 구상 클래스는 서브 클래스에서 만듬


팩토리 메소드 패턴(Factory method pattern)

- 객체를 생성할 때 필요한 인터페이스를 만듬 
- 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정 
- 팩토리 메소드 패턴을 사용하면 클래스 인스턴스 만드는 일을 서브클래스에게 맡기게 됨


행동 패턴(Behavioral Pattern)

클래스와 객체들이 상호작용하는 방법과 역할을 분담하는 방법을 다루는 패턴이다.


템플릿 메소드 패턴(Template Method Pattern)

- 알고리즘의 골격을 정의 
- 템플릿 메소드를 사용하면 알고리즘 일부 단계를 서브클래스에서 구현할 수 있음
- 알고리즘의 구조는 그대로 유지하면서 알고리즘의 특정 단계를 서브클래스에서 재정의할 수도 있음


싱글턴 패턴(Singleton Pattern)

위의 설명과 같음

상태 패턴(State Pattern)

- 상태 패턴을 사용하면 객체의 내부 상태가 바뀜에 따라서 객체의 행동을 바꿀 수 있음 
- 마치 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있음


반복자 패턴(iterator pattern)

- 컬렉션의 구현 방법을 노출하지 않으면서 집합체 내의 모든 항목에 접근하는 방법을 제공


전략 패턴(Strategy Pattern)

- 알고리즘군을 정의하고 캡슐화해서 각각의 알고리즘군을 수정해서 쓸 수 있게 해 줌 
- 전략 패턴을 사용하면 클라이언트로부터 알고리즘을 분리해서 독립적으로 변경할 수 있음

옵저버 패턴(observer pattern)

- 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다 의존성을 정의


구조 패턴(Structural Pattern)

클래스와 객체를 더 큰 구조로 만들 수 있게 구상을 사용하는 패턴입니다.


데코레이터 패턴(Decorator Pattern)

- 데코레이터 패턴으로 객체에 추가 요소를 동적으로 더할 수 있음 
- 데코레이터를 사용하면 서브클래스를 만들 때보다 훨씬 유연하게 기능을 확장할 수 있음


프록시 패턴(Proxy Pattern)

- 특정 객체로의 접근을 제어하는 대리인(특정 객체를 대변하는 객체)을 제공


컴포지트 패턴(Composite Pattern)

- 컴포지트 패턴으로 객체를 트리구조로 구성해서 부분-전체 계층구조를 구현 
- 컴포지트 패턴을 사용하면 클라이언트에서 개별 객체와 복합 객체를 똑같은 방법으로 다룰 수 있음


어댑터 패턴(Adapter pattern)

- 특정 틀래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환함 
- 인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 사용할 수 있게 도와줌


퍼사드 패턴(facade pattern)

- 서브시스템에 있는 일련의 인터페이스를 통합 인터페이스로 묶어줌
- 또한 고수준 인터페이스도 정의하므로 서브시스템을 더 편리하게 사용할 수 있음


싱글톤, 추상 팩토리, 프록시 패턴만이라도 잘 알아놓자!!

profile
미래가 기대되는 풀스택개발자 공부 이야기~~

1개의 댓글

comment-user-thumbnail
2023년 7월 25일

좋은 글 감사합니다.

답글 달기