

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 再利用可能なパターンの開発
<a name="reusable-patterns-best-practices"></a>

ソフトウェアのデザインパターンは、ソフトウェア開発に共通する問題に対する再利用可能なソリューションです。これらは、ソフトウェアエンジニアがベストプラクティスに従った製品を開発するのに役立つガイドまたはパラダイムとして機能します。このセクションでは、 AWS CDK コードベースで使用できる Abstract Factory パターンと Chain of Responsibility パターンの 2 つの再利用可能なパターンの概要を説明します。各パターンをブループリントとして使用し、コード内にある特定の設計上の問題に合わせてカスタマイズできます。デザインパターンの詳細については、Refactoring.Guru ドキュメントの「[デザインパターン](https://refactoring.guru/design-patterns)」を参照してください。

## Abstract Factory
<a name="abstract-factory"></a>

Abstract Factory パターンは、具体的なクラスを指定せずに関連オブジェクトや依存関係オブジェクトのファミリーを作成するためのインターフェイスを提供します。このパターンは、次のようなユースケースに適用されます。
+ クライアントが、システム内のオブジェクトの作成方法や構成方法に依存しない場合
+ システムが複数のオブジェクトファミリーで構成されており、これらのファミリーを一緒に使用できるように設計されている場合
+ 特定の依存関係を構築するためのランタイム値が必要な場合

Abstract Factory パターンの詳細については、Refactoring.Guru ドキュメントの「[Abstract Factory を TypeScript で](https://refactoring.guru/design-patterns/abstract-factory/typescript/example)」を参照してください。

以下のコード例は、Amazon Elastic Block Store (Amazon EBS) ストレージファクトリーを構築するために Abstract Factory パターンを使用する方法を示しています。

```
abstract class EBSStorage {
    abstract initialize(): void; 
}

class ProductEbs extends EBSStorage{
    constructor(value: String) {
        super();
        console.log(value);
    }
    initialize(): void {}
}

abstract class AbstractFactory {
    abstract createEbs(): EBSStorage
}

class EbsFactory extends AbstractFactory {
    createEbs(): ProductEbs{
        return new ProductEbs('EBS Created.')
    }
}

const ebs = new EbsFactory();
ebs.createEbs();
```

## Chain of Responsibility
<a name="chain-responsibility"></a>

Chain of Responsibility とは、ハンドラー候補チェーンの 1 人がリクエストを処理するまで、ハンドラー候補チェーンに沿ってリクエストを渡せるようにする行動デザインパターンです。Chain of Responsibility パターンは、次のようなユースケースに適用されます。
+ 実行時に決定された複数のオブジェクトがリクエストを処理する候補となる場合
+ コードでハンドラーを明示的に指定しない場合
+ レシーバーを明示的に指定せずに、複数のオブジェクトのうちの 1 つにリクエストを発行したい場合

Chain of Responsibility パターンの詳細については、Refactoring.Guru ドキュメントの「[Chain of Responsibility を TypeScript で](https://refactoring.guru/design-patterns/chain-of-responsibility/typescript/example)」を参照してください。

以下のコードは、Chain of Responsibility パターンを使用して、タスクの完了に必要な一連のアクションを構築する方法の例を示しています。

```
interface Handler {
    setNext(handler: Handler): Handler;
    handle(request: string): string;
}
abstract class AbstractHandler implements Handler
{
    private nextHandler: Handler;
    public setNext(handler: Handler): Handler {
        this.nextHandler = handler;
        return handler;
    }

    public handle(request: string): string {
        if (this.nextHandler) {
            return this.nextHandler.handle(request);
        }
        return '';
    }
}

class KMSHandler extends AbstractHandler {
    public handle(request: string): string {
        return super.handle(request);
    }
}
```