소프트웨어 디자인 패턴(software design pattern)은 소프트웨어 공학의 소프트웨어 디자인에서 공통적으로 발생하는 문제에 대해 재사용 가능한 해결책이다.
디자인 패턴은 프로그래머가 어플리케이션이나 시스템을 디자인할 때 공통된 문제들을 해결하는데에 쓰이는 형식화 된 가장 좋은 관행
개발자간의 커뮤니케이션이 원만해짐
객체지향 설계 원칙의 이해도 증가
GoF 의 디자인 패턴의 큰 항목
다양한 디자인패턴이 존재함
Singleton, Facade, Iterator 를 중점적으로
Dart 언어에서 Iterator(반복구조)는 객체에서 항목을 하나씩 가져오기 위한 인터페이스를 제공
class MyIterable implements Iterable<int> {
List<int> _data = [1, 2, 3, 4, 5];
@override
Iterator<int> get iterator => _MyIterator(_data);
}
class _MyIterator implements Iterator<int> {
final List<int> _data;
int _index = 0;
_MyIterator(this._data);
@override
bool moveNext() {
if (_index < _data.length) {
_index++;
return true;
} else {
return false;
}
}
@override
int get current => _data[_index - 1];
}
내부를 감추고 심플하게
// 복잡한 서브시스템 클래스들
class SubsystemA {
void operationA() => print("Subsystem A operation");
}
class SubsystemB {
void operationB() => print("Subsystem B operation");
}
class SubsystemC {
void operationC() => print("Subsystem C operation");
}
// 패사드 클래스
class Facade {
SubsystemA _subsystemA;
SubsystemB _subsystemB;
SubsystemC _subsystemC;
Facade() {
_subsystemA = SubsystemA();
_subsystemB = SubsystemB();
_subsystemC = SubsystemC();
}
// 클라이언트에게 간단한 인터페이스 제공
void operation() {
print("Facade operation:");
_subsystemA.operationA();
_subsystemB.operationB();
_subsystemC.operationC();
}
}
// 클라이언트 코드
void main() {
// 패사드를 사용하여 복잡한 시스템에 간단한 인터페이스 제공
var facade = Facade();
facade.operation();
}
Facade 장점
1. 클라이언트 코드는 Facade를 통해 시스템과 상호작용하면서 내부적인 복잡성을 알 필요 없음
2. 패사드 패턴은 코드를 모듈화하고 시스템을 확장하기 쉽게 제공
class MySingleton {
// 정적 멤버 변수로 유일한 인스턴스를 저장
static MySingleton _instance;
// private 생성자로 외부에서 인스턴스 생성을 방지
MySingleton._();
// 유일한 인스턴스를 반환하는 정적 메서드
static MySingleton getInstance() {
if (_instance == null) {
// 인스턴스가 없을 경우 생성
_instance = MySingleton._();
}
return _instance;
}
void printMessage() {
print("Hello from MySingleton!");
}
}
void main() {
// MySingleton의 인스턴스 얻기
var singleton1 = MySingleton.getInstance();
var singleton2 = MySingleton.getInstance();
// 두 인스턴스가 동일한지 확인
print(identical(singleton1, singleton2)); // true
// 메시지 출력
singleton1.printMessage();
}
ref)
1. "Iterator class - dart:core library - Dart API", 23.12.19, https://api.flutter.dev/flutter/dart-core/Iterator-class.html
2. "Flutter Design Patterns: 7 — Facade | by Mangirdas Kazlauskas | Flutter Community | Medium", 23.12.19, https://medium.com/flutter-community/flutter-design-patterns-7-facade-eb40434fb973
3. "[Flutter] Dart에서 Singleton pattern사용하기 | by Seong-Am Kim | Medium", 23.12.19, https://jay-flow.medium.com/dart%EC%97%90%EC%84%9C-singleton-pattern%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-2312616bbb7e