工厂方法模式
通过产品类的抽象使其创建业务主要负责用于创建多类产品的实例
简单工厂模式如果需求简单直接创建对象即可,但是随着需求变得复杂,如果用简单工厂模式,那么要添加各种各样的类别,还要修改工厂模式,比如简单工厂模式的
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);
}