1.GoF 디자인 패턴 분류
2.생성패턴
:객체의 생성과 관련된 패턴이다. 객체의 인스턴스 과정을 추상화하는 방법이다. 객체의 생성과 참조 과정을 캡슐화하여 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 받지 않도록 하여 프로그램에 유연성을 더해준다. 생성 클래스 패턴은 객체를 생성하는 일부를 서브 클래스가 담당하도록 하며, 생성 객체 패턴은 객체 생성을 다른 객체에게 위임한다.
2-1. 팩토리 메소드(Factory Method)
:객체 생성에 대한 인터페이스와 구현을 분리한다. 생성과 구현을 분리함으로써 생성할 클래스를 유연하게 생성 및 관리 할 수 있다. 인터페이스 부분과 구현부분을 따로 디렉토리로 묶어 개발할 수 있다. 새로운 클래스의 구현이 쉽다.
2-2. Abstract Factory
: 먼저 만들어야 할 컴포넌들을 추상적으로 정하고 어떤 구체적인 상황이 주어지면, 각 컴포넌트들을 구체적으로 만드는 패턴
2-3. Builder Pattern
:복잡한 구성의 객체를 효과적으로 생성하는데, Bulider Pattern은 두 가지 패턴을 가진다.
- 생성시 지정해야 할 인자가 많을 때 사용하는 패턴
- 객체 생성 시 여러 단계를 순차적으로 거칠 때, 생성 단계의 순서를 결정해 두고 각 단계를 다양하게 구현할 수 있도록 하는 패턴
2-3-1.생성시 지정해야 할 인자가 많을 때
2-3-2. 객체 생성 시 여러 단계를 순차적으로 거칠 때, 생성 단계의 순서를 결정해 두고 각 단계를 다양하게 구현할 수 있도록 하는 패턴
2-4. Prototype Pattern
- 실행 중에 생성된 객체로 다른 객체를 생성하는 패턴
- Prototype으로 만든 객체의 상태를 변경해도 원본 객체의 상태는 변경되지 않음(Deep Copy)
2-5.Singleton
- 싱글톤이 사용되는 클래스의 인스턴스가 하나만 만들어지고, 어디서든 그 인스턴스에 접근할 수 있도록 만든 패턴
- 다른 클래스들에서 접근 할 수 있지만, 객체를 생성하지 못한다.
3.구조패턴
: 클래스나 객체들을 조합해 더 큰 구조를 만드는 패턴. 구조 클래스 패턴은 상속을 통해 클래스나 인터페이스를 합성하고, 구조 객채 패턴은 객체를 합성하는 방법을 정의한다.
3-1.Adapter
3-1-1. 소개
- 기존 110V(Tiger)를 변경하지 않고 220V(Tiger Adapter)를 사용해서 110V를 220V로 사용(Animal) 가능하게 하는 패턴
- 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스(Adatper)로 변환하는 패턴
- 기존 코드를 클라이언트가 사용하는 인터페이스의 구현체로 바꿔주는 패턴
3-1-2. 장/단점
장점 | 단점 |
기존 코드를 변경하지 않고 원하는 인터페이스 구현체를 만들어 재사용 가능 | 새 클래스가 생겨 복잡도가 증가할 가능성 있음. |
기존 코드가 하던 일과 특정 인터페이스 구현체로 변환하는 작업을 각기 다른 클래스로 분리하여 관리할 수 있음 |
3-2.Bridge Pattern
3-2-1. 소개
- 기능 계층과 구현 계층의 분리로 시스템의 확장성과 유지보수성을 높이는 패턴
3-2-2. 장/단점
장점 | 단점 |
추상적인 코드를 구체적인 코드 변경 없이도 독립적으로 확장가능 | 계층 구조가 늘어나 복잡도가 증가할 가능성 있음 |
추상적인 코드와 구체적인 코드를 분리할 수 있다. |
3-3.Composite
3-3-1.소개
- 그룹 전체와 개별 객체를 동일하게 처리할 수 있는 패턴
- 클라이언트 입장에서 '전체'나 '부분'이나 모두 동일한 컴포넌트로 인식할 수 있는 계층 구조를 만든다(Part-Whole Hierarchy), 클라이언트는 구체적인 정보를 알 필요가 없다. 구체적인 정보는 Composite 객체 혹은 Leaf 객체가 알고 있다.
3-3-1. 장/단점
장점 | 단점 |
1.복잡한 트리 구조를 편리하게 사용할 수 있다. 2.다형성과 재귀를 활용할 수 있다. 3.클라이언트 코드를 변경하지 않고 새로운 엘리먼트 타입을 추가할 수 있다. |
1.트리를 만들어야 하기 때문에 (공통된 인터페이스를 정의해야 하기 떄문에) 억지로 일반화 해야 하는 경우도 생길 수 있다. |
3-4.Decorator
3-4-1.소개
- 기능을 마치 장식처럼 계속 추가할 수 있는 패턴
- 기능을 실행 중에 동적으로 변경 또는 확장 가능
Strings:장식할 대상들의 내용물
Decorator:Strings를 장식할 클래스
SideDecorator,BoxDecorator,LineNumberDecorator:Decorator를 구체적으로 구현할 클래스
Item:서로 다른 Strings와 Decorator를 하나의 개념으로 통합하는 클래스
서로 상관없는 Strings와 Decorator를 Item 추상클래스를 통해 하나의 개념으로 통합한다.
3-4-2.코드구현
Item클래스
public abstract class Item {
public abstract int getLinesCount(); //문자열이 몇줄인지 반환
public abstract int getMaxLength(); // 문자열중 가장 긴 문자열 반환
public abstract int getLength(int index); //지정된 인덱스의 지정된 문자열 반환
public abstract String getString(int index); //지정된 인덱스에 문자열 반환 0이 시작점
public void print() {
int cntLines = getLinesCount();
for(int i=0; i<cntLines; i++) {
String string = getString(i);
System.out.println(string); // 인덱스에 지정된 문자열 순서대로 반환
}
}
}
strings 클래스
import java.util.ArrayList;
import java.util.Iterator;
public class Strings extends Item {
private ArrayList<String> strings = new ArrayList<String>();
public void add(String item) {
strings.add(item);
}
@Override
public int getLinesCount() {
return strings.size(); //문자열이 몇줄인지 반환
}
@Override
public int getMaxLength() { // 문자열중 가장 긴 문자열 반환
Iterator<String> iter = strings.iterator();
int maxWidth = 0;
while(iter.hasNext()) {
String string = iter.next();
int width = string.length();
if(width > maxWidth) maxWidth = width;
}
return maxWidth;
}
@Override
public int getLength(int index) {
String string = strings.get(index);
return string.length(); //지정된 인덱스의 지정된 문자열 반환
}
@Override
public String getString(int index) { //지정된 인덱스에 문자열 반환 0이 시작점
String string = strings.get(index);
return string;
}
}
Decorator 클래스
public abstract class Decorator extends Item {
protected Item item;
public Decorator(Item item) {
this.item = item;
}
}
LineNumberDecorator 클래스
public class LineNumberDecorator extends Decorator{
public LineNumberDecorator(Item item) {
super(item);
// TODO Auto-generated constructor stub
}
@Override
public int getLinesCount() {
// TODO Auto-generated method stub
return item.getLinesCount();
}
@Override
public int getMaxLength() {
// TODO Auto-generated method stub
return item.getMaxLength()+4;
}
@Override
public int getLength(int index) {
// TODO Auto-generated method stub
return item.getLength(index+4);
}
@Override
public String getString(int index) {
// TODO Auto-generated method stub
return String.format("02d", index) + ":"+item.getString(index);
}
}
BoxDecorator 클래스
public class BoxDecorator extends Decorator{
public BoxDecorator(Item item) {
super(item);
}
@Override
public int getLinesCount() {
return item.getLinesCount()+2;
}
@Override
public int getMaxLength() {
return item.getMaxLength()+2;
}
@Override
public int getLength(int index) {
return item.getLength(index)+2;
}
@Override
public String getString(int index) {
int maxWidth = this.getMaxLength();
if(index == 0 || index == getLinesCount()-1) {
StringBuilder sb = new StringBuilder();
sb.append('+');
for(int i=0; i<maxWidth-2; i++) {
sb.append('-');
}
sb.append('+');
return sb.toString();
} else {
return '|' + item.getString(index-1)
+ makeTailString(maxWidth - getLength(index-1));
}
}
private String makeTailString(int count) {
StringBuilder sb = new StringBuilder();
for(int i=0; i<count; i++) {
sb.append(' ');
}
sb.append('|');
return sb.toString();
}
}
SideDecorator 클래스
public class SideDecorator extends Decorator {
private Character ch;
public SideDecorator(Item item, Character ch) {
super(item);
this.ch = ch;
}
@Override
public int getLinesCount() {
// TODO Auto-generated method stub
return item.getLinesCount();
}
@Override
public int getMaxLength() {
return item.getMaxLength()+2; // 작싱되는 문자열 양 옆에 문자열 "가 하나씩 붙기 떄문에 +2를 해준다.
}
@Override
public int getLength(int index) { // 작싱되는 문자열 양 옆에 문자열 "가 하나씩 붙기 떄문에 +2를 해준다.
return item.getLength(index)+2;
}
@Override
public String getString(int index) {
return ch+ item.getString(index) + ch; // "문자열" 형태가 된다.
}
}
3-4-3. 장/단점
장점 | 단점 |
1.새로운 클래스를 만들지 않고 기존 기능을 조합할 수 있다 2.컴파일 타임이 아닌 런타임에 동적으로 기능을 변경할 수 있따 |
데코레이터를 조합하는 코드가 복잡할 수 있다 |
4.행위패턴
:클래스나 객체들이 서로 상호작용하는 방법이나 어떤 태스크, 어떤 알고리즘을 어떤 객체에 할당하는 것이 좋을지 정의하는 패턴이다. 즉, 객체나 클래스의 교류방법에 대해 정의한 것이다. 행위 패턴은 하나의 객체로 수행할 수 없는 작업을 여러 객체로 분배하면서 그들간의 결합도를 최소화 할 수 있도록 도와준다. 행위 클래스 패턴은 상속을 통해 알고리즘과 제어 흐름을 기술하고, 행위 객체 패턴은 하나의 작업을 수행하기 위해 객체 집합이 어떻게 협력하는지를 기술한다.
4-2. Template Method
:상위 클래스는 골격만을 작성하고 구체적인 처리는 서브클래스로 위임한다.
출처
- 유튜브 / GIS DEVELOPER(GoF의 Design Pattern - 4. Template / 주소:https://www.youtube.com/watch?v=hPTqWJm51Vs&list=PLe6NQuuFBu7FhPfxkjDd2cWnTy2y_w_jZ&index=4)
- 인프런 / 백기선 / 코딩으로 학습하는 GoF의 디자인 패턴
- 블로그 / HERSTORY https://4z7l.github.io/2020/12/25/design_pattern_GoF.html
소스코드
'CS > 기타' 카테고리의 다른 글
[CS/기타]Jar(Java Archive)와 War(Web Application Archive) (0) | 2023.02.21 |
---|---|
[CS/기타] 빌드관리 툴 Maven과 Gradle (0) | 2023.02.21 |
[CS/UML] UML 다이어그램 (0) | 2023.02.09 |