前言
抽象工厂模式属于创建型模式,这个类型的设计模式是将 对象的创建和使用解耦了,花式的去创建对象。
抽象工厂模式
应用场景:用于创建实现相同接口的不同类型的类的对象,给多个指定类型就能够给你创建一个具体的对象。
理解:系列(品牌,比如 李宁、耐克、美特斯邦威)对象的创建和使用解耦了,抽象工厂和工厂方法不同的地方是,工厂方法像是一个大杂烩,只要指定一个参数就能得到一个创建的对象。抽象工厂会按照不同的类型来划分不同的工厂,创建的对象和工厂的类型强相关,如果想拿到某个对象,得先指定是哪种工厂然后再去指定一个参数才能得到要创建的对象。从创建对象的方式来说,工厂方法比较粗,抽象工厂相对来说更加细致一些。
namespace creative_mode_02 {
// 工厂的枚举
enum FactoryName {
MySubFactoryOne,
MySubFactoryTwo
}
// 产品的枚举
enum ClassName {
LogOne,
LogTwo,
}
interface IConsoleLog {
printLog(): void
}
type MySubFactory = typeof MySubFactoryOne | typeof MySubFactoryTwo
// 子工厂 负责创建产品
class MySubFactoryOne {
static map = new Map<ClassName, IConsoleLog>()
static addConsoleLog (key: ClassName, value: IConsoleLog) {
this.map.set(key, value)
return this
}
static getConsoleLog (key: ClassName) {
return this.map.get(key)
}
}
class MySubFactoryTwo {
static map = new Map<ClassName, IConsoleLog>()
static addConsoleLog (key: ClassName, value: IConsoleLog) {
this.map.set(key, value)
return this
}
static getConsoleLog (key: ClassName) {
return this.map.get(key)
}
}
// 抽象工厂 负责创建工厂
class MyFactory {
static factoryMap = new Map<FactoryName, MySubFactory>()
static addFactory (key: FactoryName, value: MySubFactory) {
this.factoryMap.set(key, value)
return this
}
static getFactory(key: FactoryName) {
return this.factoryMap.get(key) as MySubFactory
}
}
// SubOne系列 产品
class SubOneLogOne implements IConsoleLog {
printLog(): void {
console.log('subone log one ...')
}
}
class SubOneLogTwo implements IConsoleLog {
printLog(): void {
console.log('subone log two ...')
}
}
// SubTwo系列 产品
class SubTwoLogOne implements IConsoleLog {
printLog(): void {
console.log('subtwo log one ...')
}
}
class SubTwoLogTwo implements IConsoleLog {
printLog(): void {
console.log('subtwo log two ...')
}
}
// 给抽象工厂添加 子工厂
MyFactory.addFactory(FactoryName.MySubFactoryOne, MySubFactoryOne).addFactory(FactoryName.MySubFactoryTwo, MySubFactoryTwo)
// 给子工厂添加要生产的产品
MySubFactoryOne.addConsoleLog(ClassName.LogOne, new SubOneLogOne()).addConsoleLog(ClassName.LogTwo, new SubOneLogTwo())
MySubFactoryTwo.addConsoleLog(ClassName.LogOne, new SubTwoLogOne()).addConsoleLog(ClassName.LogTwo, new SubTwoLogTwo())
// 使用
MyFactory.getFactory(FactoryName.MySubFactoryOne).getConsoleLog(ClassName.LogOne)?.printLog()
MyFactory.getFactory(FactoryName.MySubFactoryOne).getConsoleLog(ClassName.LogTwo)?.printLog()
MyFactory.getFactory(FactoryName.MySubFactoryTwo).getConsoleLog(ClassName.LogOne)?.printLog()
MyFactory.getFactory(FactoryName.MySubFactoryTwo).getConsoleLog(ClassName.LogTwo)?.printLog()
}