设计模式5 - 工厂模式

87 阅读1分钟

工厂模式

定义

工厂模式定义创建对象的接口,但是让子类去真正的实例化,也就是将类的实例化过程延迟到子类

对比

  • 工厂类集中了所有对象的创建,便于对象的统一管理哦
  • 对象的使用者仅仅是使用产品,实现了单一职责
  • 便于扩展,如果新增了一种业务,只需要增加相关的业务对象类和工厂中的生产业务对象的方法,不需要修改其他的地方
  • 工厂模式违反了开闭原则

工厂方法模式

定义

不再有唯一的一个工厂类就创建产品,而是将不同的产品交给对应的工厂子类去实现,每个产品由负责生产的子工厂来创造,如果添加新的产品,需要做的是添加新的子工厂和产品,不需要修改其他的工厂代码

组成

  • 抽象方法类:负责定义创造产品的公共接口
  • 产品子工厂:继承抽象工厂类,实现抽象工厂类提供的接口
  • 每一种产品有各自的产品类

实现

// 工厂方法模式
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)