[Dart] 디자인 패턴

김동욱·2023년 12월 19일
0

소프트웨어 디자인 패턴(software design pattern)은 소프트웨어 공학의 소프트웨어 디자인에서 공통적으로 발생하는 문제에 대해 재사용 가능한 해결책이다.

디자인 패턴은 프로그래머가 어플리케이션이나 시스템을 디자인할 때 공통된 문제들을 해결하는데에 쓰이는 형식화 된 가장 좋은 관행

장점

개발자간의 커뮤니케이션이 원만해짐
객체지향 설계 원칙의 이해도 증가

GoF 의 디자인 패턴의 큰 항목

  • 생성 (Creational) 패턴
  • 구조 (Sturctural) 패턴
  • 행위 (Behavioral) 패턴

다양한 디자인패턴이 존재함
Singleton, Facade, Iterator 를 중점적으로

Iterator

Dart 언어에서 Iterator(반복구조)는 객체에서 항목을 하나씩 가져오기 위한 인터페이스를 제공

  • Iterable 인터페이스 구현
class MyIterable implements Iterable<int> {
  List<int> _data = [1, 2, 3, 4, 5];

  @override
  Iterator<int> get iterator => _MyIterator(_data);
}
  • Iterator 클래스 구현
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];
}

Facade

내부를 감추고 심플하게

  • 패사드(Facade) 패턴
    복잡한 시스템 또는 라이브러리의 일련의 인터페이스를 단순화된 하나의 인터페이스로 제공하는 구조적인 디자인 패턴
// 복잡한 서브시스템 클래스들
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. 패사드 패턴은 코드를 모듈화하고 시스템을 확장하기 쉽게 제공

Singleton

  • 싱글톤(Singleton) 패턴
    어떤 클래스에 대해 단일 인스턴스만 존재하도록 하는 디자인 패턴
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

profile
백엔드 개발자

0개의 댓글