JS 设计模式(一) 简单工厂模式

239 阅读2分钟

简单工厂模式

简单工厂模式又叫静态工厂方法,由一个工厂对象决定创建某一种产品对象类的实例。  
直接看情景:
比如一个商店,有篮球,足球,网球,当有顾客去买球的时候,只需要告诉店员,我要一个篮球。它就会给你一个篮球。

// 篮球基类
var Basketball = function() {
  this.intro = '这是美国篮球'
}
Basketball.prototype = {
  getMember: function() {
    console.log('每个队5个人上场');
  },
  getBallSize: function() {
    console.log('篮球很大');
  }
}

// 足球基类
var Football = function() {
  this.intro = '足球在世界流行'
}
Basketball.prototype = {
  getMember: function() {
    console.log('每个队11个人上场');
  },
  getBallSize: function() {
    console.log('足球很大');
  }
}

// 篮球基类
var Tennis = function() {
  this.intro = '每年有很多网球系列赛'
}
Basketball.prototype = {
  getMember: function() {
    console.log('每个队1个人上场');
  },
  getBallSize: function() {
    console.log('网球很小');
  }
}

// 运动工厂
var SportsFactory = function(name) {
  switch(name) {
    case 'BasketBall': 
        return new Basketball()
    case 'FootBall':
        return new Football()
    case 'Tennis': 
        return new Tennis()
  }
}

var football = SportsFactory('FootBall')
console.log(football);
console.log(football.intro);
console.log(football.getMember);

image.png 这样的话,我们只需要往这个SportFactory工厂函数内输入我们想好的内容就好了,不需要去关注这个具体是来自哪个基类,给我们省去很多时间。

另一方面,一个对象有时可以代替许多类
简单工厂模式的理念就是创建对象 上面那种方式就是对不同的类实例化,除此之外,简单工厂模式还可以用来创建相似对象。这些创建的类和对象都是相似的。形象理解工厂模式,就是一个工厂造出来的,形式都差不多。接下来,看看简单工厂模式如何创建相似对象。

function createBook(name, time, type) {
  var book = new Object()
  book.name = name
  book.time = time
  book.type = type
  book.getName = function() {
    console.log(this.name);
  }
  // 将对象返回
  return book
}

var book1 = createBook('js book', 2016, 'js')
var book2 = createBook('css book', 2011, 'css')
book1.getName()
book2.getName()

image.png
傻眼了是不是,这不就是我天天写的代码吗,就这,就这,这就是工厂模式? 没错,这就是工厂模式。

区别

第一种是通过类实例化对象创建的,第二种是通过创建一个新对象然后包装增强其属性和功能类实现的。 它们之间的差异性也造成,前面通过类创建的对象,如果这些类继承自同一父类,那么它们的父类原型上的方法是可以共用的。而后面寄生方式创建的对象都是一个新的个体,所以它们的方法就不能共用了。
当然选择哪种工厂模式来实现你的需求还是要看具体的业务需求。