

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 开发可重用模式
<a name="reusable-patterns-best-practices"></a>

软件设计模式是解决软件开发中常见问题的可重用的解决方案。它们作为指南或范式，帮助软件工程师创建遵循最佳实践的产品。本节概述了您可以在 AWS CDK 代码库中使用的两种可重用模式：抽象工厂模式和责任链模式。您可以将每种模式用作蓝图，针对代码中的特定设计问题进行自定义。有关设计模式的更多信息，请参阅 Refactoring.Guru 文档中的 [Design Patterns](https://refactoring.guru/design-patterns)。

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

抽象工厂模式提供了用于创建相关或依赖对象族的接口，而无需指定其具体类。此模式适用于以下用例：
+ 当客户端与系统中对象的创建和组合方式无关时
+ 当系统由多个对象族组成，而这些族被设计为一起使用时
+ 当必须具有运行时值才能构造特定依赖项时

有关抽象工厂模式的更多信息，请参阅 Refactoring.G [uru 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.G [ur TypeScript u 文档中的责任链](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);
    }
}
```