ちゃんなるぶろぐ

エンジニア5年生🧑‍💻 オライリーとにらめっこする毎日。

【5分でわかる🚪】TypeScriptでDesign Pattern〜Facade Pattern〜

どうも、ちゃんなるです!

今回は、Facade Patternを紹介します🖐️

概要

Facade Patternは、システムのサブシステムやインターフェースに対して、一つの統一されたインターフェースを提供するデザインパターンです。

これにより、クライアントは複雑なサブシステムを直接操作せずに、簡素化されたインターフェースを利用することができます。

Facade Patternの利点は以下の通りです。

  • システムの複雑さを隠蔽し、使いやすさを向上させる
  • クライアントとサブシステムの結合度を低く保つ
  • サブシステムの再利用性を高める

今回示すプログラムの設計

今回、複数のサブシステム(データベース操作、メール送信、ログ記録)を持つアプリケーションを想定します。

Facade Patternを使って、これらのサブシステムへのアクセスを簡単に管理する方法を示します👍

クラス図

サンプルコードのクラス図:Mermaid Live Editorで作成

クラス名 役割
Client Facadeを通してサブシステムを操作する
Facade クライアントが利用する統一インターフェースを提供
DatabaseSubsystem ユーザー情報の追加を担当
MailSubsystem メール送信を担当
LoggerSubsystem ログ記録を担当

サンプルコード

このコードでは、Facadeクラスが3つのサブシステム(DatabaseSubsystemMailSubsystemLoggerSubsystem)を内部で操作しています。

クライアントは、FacadecreateUserメソッドを呼び出すだけで、ユーザーを登録し、メールを送信し、ログを記録することができます。

class DatabaseSubsystem {
    addUser(email: string, password: string): void {
        console.log(`User added: ${email}`);
    }
}

class MailSubsystem {
    sendWelcomeEmail(email: string): void {
        console.log(`Welcome email sent to: ${email}`);
    }
}

class LoggerSubsystem {
    log(message: string): void {
        console.log(`Log: ${message}`);
    }
}
class Facade {
    private database: DatabaseSubsystem;
    private mailer: MailSubsystem;
    private logger: LoggerSubsystem;

    constructor() {
        this.database = new DatabaseSubsystem();
        this.mailer = new MailSubsystem();
        this.logger = new LoggerSubsystem();
    }

    createUser(email: string, password: string): void {
        this.database.addUser(email, password);
        this.mailer.sendWelcomeEmail(email);
        this.logger.log(`User created: ${email}`);
    }
}
class Client {
    static main(): void {
        const facade = new Facade();
        facade.createUser('example@example.com', 'password123');
    }
}

Client.main();

Facade Patternの使い道

Facade Patternは、以下のようなシナリオで適用されます。

  • 複雑なサブシステムがあり、それらを簡素化したインターフェースで提供したい場合
  • サブシステムの再利用性を高めたい場合
  • クライアントとサブシステムの結合度を低く保ちたい場合

組み合わせられるデザインパターン

Facade Patternは、以下のデザインパターンと相性が良いです。

  1. Abstract Factory Pattern: サブシステムの具体的な実装を隠蔽するために使用できます。

chan-naru.hatenablog.com

  1. Singleton Pattern: Facadeクラスのインスタンスをシステム全体で共有するために使用できます。

chan-naru.hatenablog.com

まとめ

Facade Patternは、システムの複雑さを隠蔽し、クライアントに簡単に使える統一インターフェースを提供するデザインパターンです。

サンプルコードを試して、アプリケーションの複雑さを軽減し、使いやすさと再利用性を向上させる方法を体感してみてください。

Facade Patternを活用すれば、より洗練されたコード設計ができるようになるでしょう!

参考文献

www.oreilly.com

en.wikipedia.org