您的位置:首页 > Web前端 > JavaScript

javascript设计模式-工厂模式(简单工厂)

2016-03-19 09:27 423 查看
接口在工厂模式中起着很重要的作用,如果不对对象进行某种类型检查的以确保其实现了必要的方法,工厂模式的好处也就所剩无几了,举个简单的例子。

Interface.js

// Constructor.

var Interface = function(name, methods) {
if(arguments.length != 2) {
throw new Error("Interface constructor called with " + arguments.length
+ "arguments, but expected exactly 2.");
}

this.name = name;
this.methods = [];
for(var i = 0, len = methods.length; i < len; i++) {
if(typeof methods[i] !== 'string') {
throw new Error("Interface constructor expects method names to be "
+ "passed in as a string.");
}
this.methods.push(methods[i]);
}
};

// Static class method.

Interface.ensureImplements = function(object) {
if(arguments.length < 2) {
throw new Error("Function Interface.ensureImplements called with " +
arguments.length  + "arguments, but expected at least 2.");
}

for(var i = 1, len = arguments.length; i < len; i++) {
var interface = arguments[i];
if(interface.constructor !== Interface) {
throw new Error("Function Interface.ensureImplements expects arguments "
+ "two and above to be instances of Interface.");
}

for(var j = 0, methodsLen = interface.methods.length; j < methodsLen; j++) {
var method = interface.methods[j];
if(!object[method] || typeof object[method] !== 'function') {
throw new Error("Function Interface.ensureImplements: object "
+ "does not implement the " + interface.name
+ " interface. Method " + method + " was not found.");
}
}
}
};


View Code
声明一个接口Bicycle,定义该接口应该有哪些方法

var Bicycle = new Interface("Bicycle",["assemble","wash","ride","repair"]);


构造一个简单的工厂BicycleShop,根据传递的模型,卖出不同类型的自行车。

var BicycleShop  = function(){};

BicycleShop.prototype = {
sellBicycle:function(model){
var bicycle;
switch(model){
case "The Speedster":
bicycle = new Speedster();
break;
case "The Lowrider":
bicycle = new Lowrider();
break;
case "The Comfort Cruiser":
default:
bicycle = new ComfortCruiser();
}
Interface.ensureImplements(bicycle,Bicycle);
bicycle.assemble();
bicycle.wash();
return bicycle;
}
}


建立一个Speedster类型的自行车,且该类提供了必要的方法

var Speedster = function(){
};
Speedster.prototype = {
assemble:function(){
console.log("assemble method is exected");
},
wash:function(){
console.log("wash method is exected");
},
ride:function(){
console.log("ride method is exected");
},
repair:function(){
console.log("repair method is exected");
}
}


创建一个工厂,传入模型参数

var californiaCruisers = new BicycleShop();
californiaCruisers.sellBicycle("The Speedster");


结果:



然而,如果需要加入一款新车型,那么必须为此修改BicycleShop代码,哪怕这个类的实际功能并没有发生变化。因此,更好的解决办法是把SellBicycle中的方法中创建实例的这部分交给一个简单的工厂。

var BicycleFactory = {
createBicycle:function(model){
var bicycle;
switch(model){
case "The Speedster":
bicycle = new Speedster();
break;
case "The Lowrider":
bicycle = new Lowrider();
break;
case "The Comfort Cruiser":
default:
bicycle = new ComfortCruiser();
}
Interface.ensureImplements(bicycle,Bicycle);
return bicycle;
}
}

var BicycleShop  = function(){};

BicycleShop.prototype = {
sellBicycle:function(model){
var bicycle = BicycleFactory.createBicycle(model);
bicycle.assemble();
bicycle.wash();
return bicycle;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: