乐趣区

JavaScript创建性设计模式

工厂方法模式

定义:通过对产品类的抽象使其创建业务主要用于创建多类实例
即:再构造函数中创建指定类型的实例,原型属性方法中定义创建过程
算法骨架:


  var Factory = function(type, content) {if (this instanceof Factory) {return this[type](cotent)
    } else {return (new Factory([type](content)))
    }
  }
  Factory.prototype.type1 = function(content) {}

使用场景:需要创建大量对象,对象间可以分类合并(相似度高)

建造者模式

定义:将一个复杂对象的构建与表示分离,同样的构建过程可以创建不同的表示。
即:把存在变化的部分从大对象里抽出来,在构建过程中传入参数控制变化。
算法骨架:

  var Builder = function(arg1, args2...) {var entity = {};
    entity.part1 = new Part1(arg1);
    entity.part2 = new Part2(args2);
    return entity
  }
  var Part1 = function(arg1) {switch (arg1) {case ...}
  }

使用场景:一个对象的某一部分易变就可通过建造者模式抽象出来,这样单独维护易变部分。

原型模式

定义:用原型实例指向创建对象的类,使用于创建新的对象的类共享原型实例的属性和方法。
即:把构造函数的原型指向某个实例,所有构造函数的实例对象都共享原型中属性和方法。
模式骨架 1:

var ProConstructor = function(name) { // 原型对象对应的构造函数
  this.name = name
}
ProConstructor.prototype.walk = function() { // 原型对象中的方法}
var InsContructor = function(name) { // 对象实例对应的构造函数
  ProConstructor.call(this, name) // 构造函数继承,复制一些属性,这些属性值每个对象不一样
}
InsContructor.prototype = new ProConstructor(); // 原型继承,将耗时长、每个对象都又这个值的属性和方法通过原型继承

模式骨架 2:

var ExtendPrototype = function(){var F = function(){},
  args = auguments,
  len = args.length;
  for (var i = 0; i<len; i++) {for (var item in args[i]) {F.prototype[item] = args[i][item]
    }
  }
  return new F();}

使用场景:首先时一个对象需要被多次创建(创建一次的化原型模式没有优越感),然后就是每次创建的对象有差异(没有差异的话用单例模式多好),从上面可以看出原型模式的比普通的创建的好处在于将可复用的、耗时的的逻辑放在构造函数的原型里,而将简单差异化的放在构造函数里,这样不仅省去了创建的步骤而且原型对象在内存中还被共享也就是省内存,这样就能创建很多相同或者相似的对象,而模式骨架 2 的特点在于对普通对象的继承,比较常见

单例模式

定义:是只允许实例化一次的对象类。
即:无论实例化多少次,都只产生唯一对象
模式骨架 1:

var jquery = {getDom: function(){}}
// 通过引用类型赋值只是存储引用的特点
var jquery1 = jquery;
var jquery2 = jquery; // jquery1 === jquery === jquery2

模式骨架 2:

var singleInstance = (function(){
  var instance = null;
  // 单例对象对应的构造函数
  var SingleInstance = function() {};
  return function(){
    // instance 通过特权方法访问
    if (!instance) {instance = new SingleInstance()
    }
    return instance
  }
})()
var instanceA = singleInstance();
var instanceB = singleInstance();

使用场景:需要在多个环境、多次使用某个对象,模式 1 比较简单,可以作为声明命名空间的方法,骨架 2 稍微复杂利用了闭包但是更符合面向对象的特点

退出移动版