一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情。
前言
关于设计模式,我们已经介绍了简单工厂模式与工厂方法模式。今天我们就来一起学习第三种设计模式,抽象工厂模式。老规矩,先来看看什么是抽象工厂模式。
定义
抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用于产品族的构建。抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。——百度百科
说点听得懂的,抽象工厂模式就是通过对类的工厂抽象,使其用于对产品类簇的创建,而不负责某一类产品的实例。整个例子帮助我们理解理解。
demo
首先,我们需要明白,什么是抽象类。让我们定义一个宠物的抽象类
let Pet = function(){}
Pet.proptotype = {
getPrice: function(){
return new Error('抽象方法不能调用')
},
getSex: function(){
return new Error('抽象方法不能调用')
}
}
可以看到,这个Pet类没有什么功能。调用其原型上的方法也会报错。为什么要这样设计呢?这是因为在继承中很有必要。对于宠物店的宠物来说,价格与性别都是必须的,所以它的子类继承他必须有自己的价格与性别。如果没有定义,那么我们就需要有有好的提示告知
既然了解了什么是抽象类,那就在看看如何实现抽象工厂模式。
let AbstractFactory = function(subType,superType){
// 判断抽象工厂中是否含有该抽象类
if(typeof AbstractFactory[superType] === 'function'){
// 缓存类
function Fun(){}
// 继承父的属性与方法
F.proptotype = new AbstractFactory[superType]()
// 将子类的constructor指向子类
subType.constructor = subType
// 子类原型继承父类
subType.prototype = new Fun()
}else{
throw new Error('未创建该抽象类')
}
}
AbstractFactory.Pet = function(){
this.type = 'pet'
}
AbstractFactory.Pet.proptotype = {
getPrice: function(){
return new Error('抽象方法不能调用')
},
getSex: function(){
return new Error('抽象方法不能调用')
}
}
AbstractFactory.Car = function(){
this.type = 'car'
}
AbstractFactory.Pet.proptotype = {
getPrice: function(){
return new Error('抽象方法不能调用')
},
getSpeed: function(){
return new Error('抽象方法不能调用')
}
}
let BMW = function(price,speed){
this.price = price
this.speed = speed
}
AbstractFactory(BMW,'Car')
BMW.prototype.getPrice = function(){
return this.price
}
BMW.prototype.getSpeed = function(){
return this.speed
}
let DOG = function(price,sex){
this.price = price
this.sex = sex
}
AbstractFactory(DOG,'Pet')
DOG.prototype.getPrice = function(){
return this.price
}
DOG.prototype.getSex = function(){
return this.sex
}
let jinmao = new DOG(1000,'雌')
console.log(jinmao.getPrice()) //1000
console.log(jinmao.type) //pet
总结
抽象工厂模式是设计模式中最抽象的一种,也是创建模式中唯一一种抽象化创建模式。通过抽象工厂,我们可以知道每个子类属于哪一种类别,他们也具备该类所必备的属性与方法。