通过产品类的抽象使其创建业务主要负责用于创建多类产品的实例
简单工厂模式如果需求简单直接创建对象即可,但是随着需求变得复杂,如果用简单工厂模式,那么要添加各种各样的类别,还要修改工厂模式,比如简单工厂模式的
var sportsFactory = function(name) { switch(name) { case 'NBA': return new BasketBall(); case 'wordCup': return new FootBall(); } }随着类别增加需要不断的修改switch里面代码,所以下面引出工厂方法模式。
比如我们创建了一个类,所以用new来实例化,但是其他人可能不知道这个是个类,直接调用的,这样就会发生错误,所以非安全类的例子如下
var NoSafe = function() {} NoSafe.prototype = { show: function() { console.log("安全"); } } var s = NoSafe(); s.show(); // 报错解决方案很简单,就是在构造函数开始的时候判断当前对象this指代是不是类,如果是则通过new创建对象,否则就是类在全局作用域中执行的,也就是此时this指向的是window,所以这么改
var Safe = function() { if (!(this instanceof Safe)) { return new Safe(); } } Safe.prototype = { show: function() { console.log("安全"); } } var s = Safe(); s.show(); // 可以获取到代码如下(示例):
var Factory = function(type, content) { if (this instanceof Factory) { var s = new this[type](content); return s; } else { return new Factory(type, content); } } // 工厂设置所有类型数据对象的基类 Factory.prototype = { FootBall: function() { ..... }, BasketBall: function() {....}, Volleyball: function() {....} } // 添加数据 var data = [ {type: 'FootBall', content: "足球"}, {type: 'BasketBall', content: "蓝球"}, {type: 'Volleyball', content: "排球"} ]; for (var i = 3; i >= 0; i--) { Factory(data[i].type, data[i].content); }