作成日: 2023/03/31
0

Node.jsでよく使うデザインパターン

Node.jsはJavaScriptによるサーバーサイドの開発に適したプラットフォームとして、広く使われています。そのため、多くのプログラマーがNode.jsを使って開発を行っており、ソフトウェアの品質向上のためにデザインパターンを使うことが重要となっています。本記事では、Node.jsでよく使われるデザインパターンを紹介します。

1. シングルトンパターン

シングルトンパターンは、あるクラスのインスタンスを常に1つだけ持ち、そのインスタンスにアクセスするための方法を提供するデザインパターンです。Node.jsにおいても、シングルトンパターンはよく使われます。例えば、アプリケーション全体で共有するデータなどを扱う場合に、シングルトンパターンが活用されます。

class Singleton {
  constructor() {
    if (!Singleton.instance) {
      Singleton.instance = this;
    }
    return Singleton.instance;
  }
}

このように、constructor内でSingletonのインスタンスが存在しなければインスタンス化され、Singletonのインスタンスが存在する場合には、それが戻り値として返されるようにすることで、シングルトンパターンを実現することができます。

2. ファサードパターン

ファサードパターンは、複雑な処理をまとめてシンプルなインターフェースを提供するデザインパターンです。Node.jsにおいても、ファサードパターンはよく使われます。例えば、複数のモジュールを組み合わせて、簡単なAPIを提供する場合にファサードパターンが活用されます。

class Facade {
  constructor() {
    this.moduleA = new ModuleA();
    this.moduleB = new ModuleB();
  }

  doSomething() {
    this.moduleA.doSomething();
    this.moduleB.doSomething();
  }
}

このように、Facadeクラス内で複数のモジュールをインスタンス化し、シンプルなインターフェースとしてdoSomethingメソッドを提供することで、ファサードパターンを実現することができます。

3. オブザーバーパターン

オブザーバーパターンは、オブジェクトの状態変化を監視し、その状態に合わせて他のオブジェクトに通知するデザインパターンです。Node.jsにおいても、オブザーバーパターンはよく使われます。例えば、異なるモジュールで共通のデータを監視する場合に、オブザーバーパターンが活用されます。

class Observer {
  constructor() {
    this.observers = [];
  }

  subscribe(observer) {
    this.observers.push(observer);
  }

  notify(data) {
    this.observers.forEach(observer => {
      observer.update(data);
    });
  }
}

class ModuleA {
  constructor(observer) {
    observer.subscribe(this);
  }

  update(data) {
    console.log(data);
  }
}

const observer = new Observer();
const moduleA = new ModuleA(observer);

observer.notify('data');

このように、Observerクラスがオブザーバーパターンの中核となり、ModuleAクラスがObserverからの通知を受けることで、オブザーバーパターンを実現することができます。

4. ファクトリーパターン

ファクトリーパターンは、オブジェクトの生成を抽象化するデザインパターンです。Node.jsにおいても、ファクトリーパターンはよく使われます。例えば、サーバーサイドにおける複数のモジュールで共通するオブジェクトの生成を抽象化し、共通の方法で生成する場合に、ファクトリーパターンが活用されます。

class Factory {
  create() {
    return new Product();
  }
}

class Product {}

const factory = new Factory();
const product = factory.create();

このように、Factoryクラスがオブジェクトの生成を抽象化し、Productクラスが生成されるオブジェクトとなります。そして、factory.createメソッドを通じて、Productクラスのインスタンスを生成することができます。

5. プロキシーパターン

プロキシーパターンは、あるオブジェクトへのアクセスを制限したり、オブジェクトに追加の機能を提供するデザインパターンです。Node.jsにおいても、プロキシーパターンはよく使われます。例えば、モジュールを利用する前にプロキシーで認証処理を行う場合に、プロキシーパターンが活用されます。

class Proxy {
  constructor(subject) {
    this.subject = subject;
  }

  request() {
    if (this.checkAuth()) {
      this.subject.request();
    }
  }

  checkAuth() {
    return true;
  }
}

class RealSubject {
  request() {
    console.log('request');
  }
}

const realSubject = new RealSubject();
const proxy = new Proxy(realSubject);

proxy.request();

このように、Proxyクラスでアクセス制限や追加の機能を提供し、RealSubjectクラスで実際の処理を行うことで、プロキシーパターンを実現することができます。

まとめ

Node.jsでよく使われるデザインパターンを紹介しました。それぞれのデザインパターンが、どのような場面で活用されるかを理解することは、ソフトウェアの品質向上につながります。この記事を参考にして、Node.jsで開発を行う際にデザインパターンを有効活用してみてください。

参考:


フルスタックエンジニア。徒然なるままに記事を投稿していきます。日々学習。