# 重构以实现设计模式

副驾驶聊天 可以建议可用于改进代码的设计模式。

不遵循既定设计模式（如单例模式、工厂模式或观察者模式）的代码可能会导致紧耦合、缺乏灵活性或代码重复等问题。

副驾驶聊天 可以帮助你运用合适的设计模式，使你的代码更具灵活性且更易于维护。 例如，它可以建议将重复性的实例化转换为工厂模式，或者使用观察者模式来分离紧密相连的类。

> \[!NOTE] 本文中所述的响应是示例。 副驾驶聊天 的回答是不确定的，因此你可能会得到与这里所显示的不同的回答。

## 示例方案

这段 JavaScript 代码创建了三个 `Person` 对象，每个对象都具有 `name` 和 `age` 属性。 然后它使用一个人的名字来检索并打印出其年龄。

```javascript id=person-module
class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
}

var people = {};

function addPerson(name, age) {
  people[name] = new Person(name, age);
}

function getAge(name) {
  if (people[name]) {
    console.log(name + " is " + people[name].age + " years old.");
  } else {
    console.log("Person not found.");
  }
}

addPerson("Ana", 30);
addPerson("Mario", 25);
addPerson("Louise", 40);

getAge("Mario");
```

## 示例提示 1

```copilot copy prompt ref=person-module
What design patterns could improve this code? Don't show me code examples.
```

## 示例响应 1

Copilot 建议使用以下模式：

* 单例模式\*\*\*\*：确保 `people` 对象只有一个实例。
* 工厂模式\*\*\*\*：创建用于创建 `Person` 对象的工厂。
* 模块模式\*\*\*\*：将 `people` 对象及相关函数封装在一个模块内，以避免污染全局命名空间。

## 示例提示 2

现在你可以要求 Copilot 实现你认为最合适的模式。

```copilot copy prompt ref=person-module
Refactor this code using the module pattern
```

## 示例响应 2

```javascript
const PersonModule = (function() {
  class Person {
    constructor(name, age) {
      this.name = name;
      this.age = age;
    }
  }

  const people = {};

  function addPerson(name, age) {
    people[name] = new Person(name, age);
  }

  function getAge(name) {
    if (people[name]) {
      console.log(name + " is " + people[name].age + " years old.");
    } else {
      console.log("Person not found.");
    }
  }

  return {
    addPerson,
    getAge
  };
})();

PersonModule.addPerson("Ana", 30);
PersonModule.addPerson("Mario", 25);
PersonModule.addPerson("Louise", 40);

PersonModule.getAge("Mario");
```

模块模式可改善代码组织，增强数据隐私，并降低命名冲突的风险，从而使代码更易于维护和缩放。

## 其他阅读材料

* [GitHub Copilot 对话助手的提示设计](/zh/copilot/using-github-copilot/prompt-engineering-for-github-copilot)
* [使用 GitHub Copilot 的最佳做法](/zh/copilot/using-github-copilot/best-practices-for-using-github-copilot)