Update README.md

This commit is contained in:
JasonSun 2021-05-26 14:51:20 +08:00 committed by GitHub
parent ca299c6242
commit 0b66686071
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -217,72 +217,75 @@ marketingManager.takeInterview() // 输出:提出社区建设问题!
### 🔨 抽象工厂模式 / Abstract Factory ### 🔨 抽象工厂模式 / Abstract Factory
Real world example 现实生活中的例子
> Extending our door example from Simple Factory. Based on your needs you might get a wooden door from a wooden door shop, iron door from an iron shop or a PVC door from the relevant shop. Plus you might need a guy with different kind of specialities to fit the door, for example a carpenter for wooden door, welder for iron door etc. As you can see there is a dependency between the doors now, wooden door needs carpenter, iron door needs a welder etc.
In plain words > 现在让我们拓展简单工厂模式里门的例子。根据您的需要,您可能会从木门店买到木门,从铁门店买到铁门,或是从相应的商店买到塑料门。此外,您可能需要有着不同专业能力的师傅来安装这些门,比如让木匠安装木门,让焊工安装铁门等等。正如您所看到的,现在门(与人)之间有一种依赖关系,木门需要木匠,铁门需要焊工等等。
> A factory of factories a factory that groups the individual but related/dependent factories together without specifying their concrete classes.
Wikipedia says
> The abstract factory pattern provides a way to encapsulate a group of individual factories that have a common theme without specifying their concrete classes
**Programmatic Example** 简单来说
Translating the door example above. First of all we have our `Door` interface and some implementation for it > 工厂的工厂;一个工厂,它将独立但是相关(或互相依赖)的工厂组成一组,而不用指定这些工厂的具体类。
维基百科这样描述
> 抽象工厂模式提供了一种封装一组具有共同主题的独立工厂的方法,而不必指定它们的具体类。
**编程示例**
根据上面门的例子。首先,我们定义了 `Door`(门)接口和它的一些实现
```js ```js
/* /**
Door interface : * Door interface :
*
getDescription() * getDescription()
*/ */
class WoodenDoor { class WoodenDoor {
getDescription() { getDescription() {
console.log('I am a wooden door') console.log('我是一个木门')
} }
} }
class IronDoor { class IronDoor {
getDescription() { getDescription() {
console.log('I am an iron door') console.log('我是一个铁门')
} }
} }
``` ```
Then we have some fitting experts for each door type 接着我们为每一种类型的门定义了安装师傅
```js ```js
/* /**
DoorFittingExpert interface : * DoorFittingExpert interface :
*
getDescription() * getDescription()
*/ */
class Welder { class Welder {
getDescription() { getDescription() {
console.log('I can only fit iron doors') console.log('我只能安装木门')
} }
} }
class Carpenter { class Carpenter {
getDescription() { getDescription() {
console.log('I can only fit wooden doors') console.log('我只能安装铁门')
} }
} }
``` ```
Now we have our abstract factory that would let us make family of related objects i.e. wooden door factory would create a wooden door and wooden door fitting expert and iron door factory would create an iron door and iron door fitting expert 现在我们有了抽象工厂,它允许我们创建一系列相关联的对象。比如,木门工厂能够制造木门和提供木门安装师傅,铁门工厂能够制造铁门和提供铁门安装师傅。
```js ```js
/* /**
DoorFactory interface : * DoorFactory interface :
*
* makeDoor()
* makeFittingExpert()
*/
makeDoor() // 返回木匠和木门的木门工厂
makeFittingExpert()
*/
// Wooden factory to return carpenter and wooden door
class WoodenDoorFactory { class WoodenDoorFactory {
makeDoor(){ makeDoor(){
return new WoodenDoor() return new WoodenDoor()
@ -293,7 +296,7 @@ class WoodenDoorFactory {
} }
} }
// Iron door factory to get iron door and the relevant fitting expert // 获得铁门和相应安装师傅的铁门工厂
class IronDoorFactory { class IronDoorFactory {
makeDoor(){ makeDoor(){
return new IronDoor() return new IronDoor()
@ -305,7 +308,7 @@ class IronDoorFactory {
} }
``` ```
And then it can be used as 最后我们可以这样使用它
```js ```js
woodenFactory = new WoodenDoorFactory() woodenFactory = new WoodenDoorFactory()
@ -313,24 +316,24 @@ woodenFactory = new WoodenDoorFactory()
door = woodenFactory.makeDoor() door = woodenFactory.makeDoor()
expert = woodenFactory.makeFittingExpert() expert = woodenFactory.makeFittingExpert()
door.getDescription() // Output: I am a wooden door door.getDescription() // 输出:我是一个木门
expert.getDescription() // Output: I can only fit wooden doors expert.getDescription() // 输出:我只能安装木门
// Same for Iron Factory // 铁门工厂和上面一样
ironFactory = new IronDoorFactory() ironFactory = new IronDoorFactory()
door = ironFactory.makeDoor() door = ironFactory.makeDoor()
expert = ironFactory.makeFittingExpert() expert = ironFactory.makeFittingExpert()
door.getDescription() // Output: I am an iron door door.getDescription() // 输出:我是一个铁门
expert.getDescription() // Output: I can only fit iron doors expert.getDescription() // 输出:我只能安装铁门
``` ```
As you can see the wooden door factory has encapsulated the `carpenter` and the `wooden door` also iron door factory has encapsulated the `iron door` and `welder`. And thus it had helped us make sure that for each of the created door, we do not get a wrong fitting expert. 正如您看到的,木门工厂已经封装了 `carpenter`(木匠)和 `wooden door`(木门),铁门工厂已经封装了 `iron door`(铁门)和 `welder`(焊工)。因此,它确保了对于每一个制造出来的门,我们都能得到正确的安装师傅。
**When to use?** **什么时候使用?**
When there are interrelated dependencies with not-that-simple creation logic involved 当对象之间存在相互依赖的关系,涉及的创建逻辑并不那么简单时。
### 👷 生成器模式 / Builder ### 👷 生成器模式 / Builder