Justin의 개발 로그
article thumbnail

Abstract Factory - 추상 팩토리

구체적인 클래스를 지정하지 않고 관련성을 갖는 객체들의 집합을 생성하거나

서로 독립적인 객체들의 집합을 생성할 수 있는 인터페이스를 제공하는 패턴

Adapter - 어댑터

클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로

호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 함

Bridge - 브릿지

구현부에서 추상층을 분리하여 각자 독립적으로 변형할 수 있게 하는 패턴
추상적 개념에 해당하는 클래스와 실제 구현부를 분리함으로써 문제를 해결

 

Builder - 빌더

복합 객체의 생성 과정과 표현방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴

 

Chain of Responsibility 책임 연쇄

요청을 처리할 수 있는 기회를 하나 이상의 객체에게 부여하여 요청을 보내는 객체와 그 요청을 받는 객체 사이의 결합을 피하는 패턴

요청을 받을 수 있는 객체를 연쇄적으로 묶고, 실제 요청을 처리할 객체를 만날 때까지 객체 고리를 따라서 요청을 전달합니다

 

Command - 커맨드

요청을 객체의 형태로 캡슐화하여 서로 요청이 다른 사용자의 매개변수화,

요청 저장 또는 로깅, 그리고 연산의 취소를 지원하게 만드는 패턴

Invoker = SimpleRemoteControl

Invoker - Client가 Command를 만들어 등록하는 객체, 커맨드 등록 메소드(setCommand), 커맨드 실행을 위한 트리거 메소드로 구성됨(execute, onButton, undoButton ...)
Receiver - Invoker에 등록된 커맨드를 실행하면 실제로 동작하는 객체 (예-거실전등이 켜짐. 여기서 거실 전등이 Receiver)

Invoker = RemoteControl, Receiver1 = Light

Composite - 컴포짓

객체들의 관계를 트리 구조로 구성하여 부분-천체 계층을 표현하는 패턴으로

사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다.

Decorator - 데코레이터

주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴으로, 기능 확장이 필요할 때 서브클래싱 대신 쓸수 있는 유연한 대안

//Component
public abstract class Beverage {
  String description = "";
  
    public String getDescription() {
      return description;
    }
  
    publid abstract double cost();
 }
 
 // Decorator
 //   데코레이팅이 필요한 경우 이 추상 클래스를 상속받아서 역할(로직)을 추가
 public abstract class CondimentDecorator extends Beverage {
   Beverage beverage;
   public abstract String getDescription();
 }
 
//ConcreteComponent
public class HouseBlend extends Beverage {
  public HouseBlend() {
    description = "하우스 블렌드 커피";
  }
  
  public double cost() {
    return .89;
  }
}

//ConcreateDecorator
public class Mocha extends CodimentDecorator {
  public Mocha(Beverage beverage) {
    this.beverage = beverage;
  }
  
  public String getDescription() {
    return beverage.getDescription() + ", 모카";
  }
  
  public double cost() {
    return beverage.cost() + .20;
  }
}

//Client
public class StarbusCoffee {
  public static void main(String[] args) {
    Beverage beverage = new Espresso();
    System.out.println(beverage.getDescription() + " $" + beverage.cost());
    
    Beverage beverage2 = new HouseBlend();
    Beverage2 = new Mocha(beverage2);  //모카샷 추가
    Beverage2 = new Mocha(beverage2);  //모카샷 추가
    System.out.println(beverage2.getDescription() + " $" + beverage2.cost());
  }
}

Facade - 퍼사드

서브 시스템에 있는 인터페이스 집합에 대해서 하나의 통합된 인터페이스를 제공하는 패턴으로,

서브시스템을 좀더 사용하기 편하게 만드는 상위 수준의 인터페이스를 정의

예) 컴포넌트 오디오에서 On 버튼을 누르면, 각 컴포넌트를 모두 On 시키고, 마지막 볼륨 상태 및 이퀄라이저를 셋팅하고, 
가장 최근 재생하던 재생 목록의 마지막 듣던 음악의 처음부터 재생한다.

 

 

Factory Method - 팩토리 메서드

객체를 생성하는 인터페이스는 미리 정의하되, 인스턴스를 만들 클래스의 결정은 서브클래스 쪽에서 내리는 패턴

팩토리 메서드 패턴에서는 클래스의 인스턴스를 만드는 시점을 서브 클래스로 미룬다.

public abstract class Pizza {
	String name;
	String dough;
 
	void prepare() {
		System.out.println("Prepare " + name);
		System.out.println("Tossing dough...");
    }
    
    void doSomething() {
       ...
    }
}

public class ChicagoStyleCheesePizza extends Pizza {

	public ChicagoStyleCheesePizza() { 
		name = "Chicago Style Deep Dish Cheese Pizza";
		dough = "Extra Thick Crust Dough";
	}
 
	void doSomething() {
		System.out.println("Doing something to the pizza");
	}
}


public abstract class PizzaStore {
 
	abstract Pizza createPizza(String item);
 
	public Pizza orderPizza(String type) {
		Pizza pizza = createPizza(type);
		pizza.prepare();
        pizza.doSomething();
		// ... do something 
        
		return pizza;
	}
}

public class ChicagoPizzaStore extends PizzaStore {
	Pizza createPizza(String item) {
        	if (item.equals("cheese")) {
            		return new ChicagoStyleCheesePizza();
        	} else if (item.equals("veggie")) {
        	    	return new ChicagoStyleVeggiePizza();
        	} else return null;
	}
}

public class PizzaTestDrive {
 
	public static void main(String[] args) {
		PizzaStore chicagoStore = new ChicagoPizzaStore();
 
		Pizza pizza = chicagoStore.orderPizza("cheese");
		System.out.println("Ethan ordered a " + pizza.getName() + "\n");
    }
}

Flyweight - 플라이웨이

크기가 작은 객체가 여러개 있을 때, 공유를 통해 이들을 효율적으로 지원하는 패턴

 

Interpreter - 인터프리터

주어진 언어에 대해 그 언어의 문법을 위한 표현 수단을 정의하고

이와 아울러 그 표현 수단을 사용하여 해당 언어로 작성된 문장을 해석하는 해석기를 정의하는 패턴

Iterator - 이터레이터

내부 표현부를 노출하지 않고, 어떤 객체 집합에 속한 원소들을 순차적으로 접근할 수 있는 방법을 제공

Mediator - 중재자

한 집합에 속해있는 객체들의 상호작용을 캡슐화하는 객체를 정의하는 패턴

객체들이 직접 서로 참조하지 않도록 함으로써 객체들 사이의 소결합(loose coupling)을 촉진 시키며, 개발자가 객체들의

상호작용을 독립적으로 다양화시킬 수 있게 만든다.

 

Memento - 메멘토

캡슐화를 위해바지 않은 채 어떤 객체의 내부 상태를 잡아내고 실체화 시켜 이후에 해당 객체가

그 상태로 다시 되돌아올 수 있도록 하는 패턴

 

Observer - 옵저버

객체 사이에 일 대 다의 의존관계를 정의해 두어, 어떤 객체의 상태가 변할 때

그 객체의 의존성을 가진 다른 객체들이 그 변화를 통지 받고 자동으로 갱신 될 수 있게 만드는 패턴

Prototype - 프로토타입

생성할 객체의 종류를 명세화하는 데에 원형이 되는 예시물을 이용하고,

그 원형을 복제함으로써 새로운 객체를 생성하는 패턴

 

Proxy - 프록시

어떤 다른 객체로 접근하는 것을 통제하기 위해서 그 객체의 대리자(surrogate)또는 자리채움자(Placehoder)를 제공하는 패턴

 

Singleton - 싱글톤

어떤 클래스의 인스턴스는 오직 하나임을 보장하며,

이 인스턴스에 접근할 수 있는 전역적인 접촉점을 제공하는 패턴

 

State - 상태

객체의 내부 상태에 따라 스스로 행동을 변경할 수 있게 끔 허가하는 패턴으로

이렇게 하면 객체는 마치 자신의 클래스를 바꾸는 것처럼 보임

 

Strategy - 전략

동일 계열의 알고리즘 군을 정의 하고 각각의 알고리즘을 캡슐화하며 이들을 상호교환이 가능하도록 만드는 패턴

알고리즘을 사용하는 사용자와 상관없이 독립적으로 알고리즘을 다양하게 변경할수 있게 한다.

 

Template Method - 템플릿 메서드

객체의 연산에는 알고리즘의 뼈대만을 정의하고 각 단게에서 수행할 구체적 처리는 서브 클래스 쪽으로 미루는 패턴

알고리즘의 구조 자체는 그대로 놔둔채 알고리즘 각 단계의 처리를 서브클래스에서 재정의 할 수 있게 한다.

 

Visitor - 비지터

객체 구조를 이루는 원소에 대해 수행할 연산을 표현하는 패턴

연산을 적용할 원소의 클래스를 변경하지 않고도 새로운 연산을 정의할수 있게 함

 

- 패턴 정리가 깔끔한 사이트 - 
https://wikidocs.net/580

 https://rookienerd.com/tutorial/design-pattern/command-design-pattern

profile

Justin의 개발 로그

@라이프노트

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!