工厂模式
定义
工厂模式定义创建对象的接口,但是让子类去真正的实例化,也就是将类的实例化过程延迟到子类
对比
- 工厂类集中了所有对象的创建,便于对象的统一管理哦
- 对象的使用者仅仅是使用产品,实现了单一职责
- 便于扩展,如果新增了一种业务,只需要增加相关的业务对象类和工厂中的生产业务对象的方法,不需要修改其他的地方
- 工厂模式违反了开闭原则
工厂方法模式
定义
不再有唯一的一个工厂类就创建产品,而是将不同的产品交给对应的工厂子类去实现,每个产品由负责生产的子工厂来创造,如果添加新的产品,需要做的是添加新的子工厂和产品,不需要修改其他的工厂代码
组成
- 抽象方法类:负责定义创造产品的公共接口
- 产品子工厂:继承抽象工厂类,实现抽象工厂类提供的接口
- 每一种产品有各自的产品类
实现
// 工厂方法模式
function PlaneFactory () {
}
// 子工厂类都可以使用的公共方法
PlaneFactory.prototype.touch = function () {
this.blood -= 50
if(this.blood === 0) {
this.die()
}
}
//
PlaneFactory.prototype.SmallPlane = function () {
this.width = 100
this.height = 100
this.blood = 100
this.name = 'SmallPlane'
}
PlaneFactory.prototype.BigPlane = function (x, y) {
this.x = x;
thsi.y = y;
this.width = 100
this.height = 100
this.blood = 100
this.name = 'BigPlane'
}
// 扩展方法
PlaneFactory.prototype.die = function () {
consoel.log('die')
}
// 创建对象的接口
PlaneFactory.create = function (type, ...args) {
if (!PlaneFactory.prototype[type]) {
throw 'no this type'
}
// 继承
if (PlaneFactory.prototype[type].prototype.__proto__ !== PlaneFactory.prototype) {
PlaneFactory.prototype[type].prototype = new PlaneFactory()
}
const newPlane = new PlaneFactory.prototype[type](...args)
}
const oSp = PlaneFactory.create('SmallPlane', x, y)