文章目录
- 抽象工厂模式:一个神奇的玩具制造商
- 主要思想:玩具制造商的秘密
- 这个制造商有什么好处和坏处?
- 如何打造这个神奇的玩具制造商?
- 代码实现案例
- 抽象工厂模式主要优点
- 抽象工厂模式主要缺点
- 抽象工厂模式适用场景
- 总结
抽象工厂模式:一个神奇的玩具制造商
想象一下,你有一个神奇的玩具制造商,可以制造各种主题的玩具套装,比如"海洋世界"或"太空探险"。这就是抽象工厂模式的本质!
主要思想:玩具制造商的秘密
那么每个主题(比如海洋世界)就是一个"产品家族",制造商(工厂)可以生产该主题的所有玩具,你只需告诉制造商你想要哪个主题,而不用关心具体怎么做,就像你不需要知道玩具是如何制造的,你只需选择主题,然后享受玩具,你不想操心每个玩具怎么做,只想专注于玩,你想轻松切换主题,比如从海洋世界换成太空探险!
这个制造商有什么好处和坏处?
在确保所有玩具风格一致的情况下,就不会出现海豚在太空船里的尴尬情况,你不用记住每个玩具的制作方法,省心省力,想加入新主题或新玩具很容易,不影响已有的玩具。当然,他的小缺点就是可能会有很多种类的玩具和主题,管理起来有点复杂罢了。
如何打造这个神奇的玩具制造商?
- 设计每种玩具的基本样子(抽象产品)
- 制作具体的玩具(具体产品)
- 设计制造商的基本能力(抽象工厂)
- 创建能制造特定主题玩具的制造商(具体工厂)
- 开始使用制造商来获得你想要玩的主题玩具!
通过这种方式,你可以轻松地获得各种主题的玩具套装,而不用关心它们是如何制造的。这就是抽象工厂模式的魔力所在!
代码实现案例
// 抽象产品(玩具)
interface Toy {
play(): void;
}
// 具体产品(海洋玩具)
class OceanToy implements Toy {
play(): void {
console.log("Playing with ocean toy");
}
}
// 具体产品(太空玩具)
class SpaceToy implements Toy {
play(): void {
console.log("Playing with space toy");
}
}
// 抽象工厂(玩具制造商)
interface ToyFactory {
createToy(): Toy;
}
// 具体工厂(海洋玩具制造商)
class OceanToyFactory implements ToyFactory {
createToy(): Toy {
return new OceanToy();
}
}
// 具体工厂(太空玩具制造商)
class SpaceToyFactory implements ToyFactory {
createToy(): Toy {
return new SpaceToy();
}
}
// 使用海洋玩具制造商
const oceanToyFactory = new OceanToyFactory();
// 使用海洋玩具制造商创建海洋玩具
const oceanToy = oceanToyFactory.createToy();
// 使用海洋玩具
oceanToy.play(); // 输出: Playing with ocean toy
// 使用太空玩具制造商
const spaceToyFactory = new SpaceToyFactory();
// 使用太空玩具制造商创建太空玩具
const spaceToy = spaceToyFactory.createToy();
// 使用太空玩具
spaceToy.play(); // 输出: Playing with space toy
抽象工厂模式主要优点
- 封装性:将对象的创建逻辑封装在工厂类中,客户端代码不需要了解具体的创建过程。
- 易于扩展:添加新的具体工厂和产品非常容易,符合开闭原则。
- 一致性:确保同一工厂创建的产品相互匹配。
抽象工厂模式主要缺点
- 复杂性:随着产品族的增加,工厂类和产品类的数量也会增加,导致系统变得复杂。
- 性能开销:每次创建产品时,都需要通过工厂类,可能会引入一定的性能开销。
抽象工厂模式适用场景
- 需要创建一系列相关或依赖对象时:例如,创建不同类型的按钮和文本框。
- 需要确保产品的一致性时:例如,创建不同类型的文档和打印设置。
总结
抽象工厂模式是一种强大且灵活的设计模式,适用于需要创建一系列相关或依赖对象的场景。本篇通过将对象的创建逻辑封装在工厂类中,实现了对象的创建与使用的分离,从而提高了系统的灵活性和可扩展性。
喜欢的话就点个赞❤️,关注一下吧,有问题也欢迎讨论指教。感谢大家!!!
下期预告:TypeScript 设计模式之【生成器】