

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 開發可重複使用的模式
<a name="reusable-patterns-best-practices"></a>

軟體設計模式是軟體開發中常見問題的可重複使用解決方案。其作為指南或範例，可協助軟體工程師建立遵循最佳實務的產品。本節提供兩種可重複使用模式的概觀，您可以在 AWS CDK 程式碼庫中使用：抽象工廠模式和責任鏈模式。您可以使用每個模式作為藍圖，並針對程式碼中的特定設計問題進行自訂。如需有關設計模式的詳細資訊，請參閱 Refactoring.Guru 文件中的[設計模式](https://refactoring.guru/design-patterns)。

## 抽象工廠
<a name="abstract-factory"></a>

「抽象工廠」模式提供了用於建立相關或相依物件的系列的介面，而無需指定其具體類別。此模式適用於下列使用案例：
+ 當用戶端獨立於您在系統中建立和撰寫物件的方式時
+ 當系統由多個物件系列組成，且這些系列設計為一起使用時
+ 當您必須具有執行期值來建構特定相依性時

如需有關「抽象工廠」模式的詳細資訊，請參閱 Refactoring.Guru 文件中的 [TypeScript 中的抽象工廠](https://refactoring.guru/design-patterns/abstract-factory/typescript/example)。

下列程式碼範例顯示如何使用「抽象工廠」模式建構 Amazon Elastic Block Store (Amazon EBS) 儲存工廠。

```
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();
```

## 責任鏈
<a name="chain-responsibility"></a>

責任鏈是一種行為設計模式，可讓您沿著潛在處理常式鏈傳遞請求，直到其中一個處理常式處理該請求。「責任鏈」模式適用於下列使用案例：
+ 當在執行期確定的多個物件是處理請求的候選者時
+ 當您不想在程式碼中明確指定處理常式時
+ 當您想要向多個物件之一發出請求而不明確指定接收者時

如需有關「責任鏈」模式的詳細資訊，請參閱 Refactoring.Guru 文件中的 [TypeScript 中的責任鏈](https://refactoring.guru/design-patterns/chain-of-responsibility/typescript/example)。

下列程式碼顯示如何使用「責任鏈」模式建置完成任務所需的一系列動作的範例。

```
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);
    }
}
```