javascript设计模式-工厂模式(简单工厂)
2016-03-19 09:27
423 查看
接口在工厂模式中起着很重要的作用,如果不对对象进行某种类型检查的以确保其实现了必要的方法,工厂模式的好处也就所剩无几了,举个简单的例子。
Interface.js
View Code
声明一个接口Bicycle,定义该接口应该有哪些方法
构造一个简单的工厂BicycleShop,根据传递的模型,卖出不同类型的自行车。
建立一个Speedster类型的自行车,且该类提供了必要的方法
创建一个工厂,传入模型参数
结果:
然而,如果需要加入一款新车型,那么必须为此修改BicycleShop代码,哪怕这个类的实际功能并没有发生变化。因此,更好的解决办法是把SellBicycle中的方法中创建实例的这部分交给一个简单的工厂。
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; } }
相关文章推荐
- JSP九大内置对象及四个作用域
- JSP serverlet区别与联系
- JSON与XML的区别比较
- 项目常用Javascript分享,包含常用验证和Cookie操作
- js变量提升
- jsp和weblogic和ant的关联
- mysql和dos和javascript的关联
- html和javascript和windows的关联
- jboss和jsp和context的关联
- .net和sybase和javascript的关联
- 深入解析JavaScript中函数的Currying柯里化
- JavaScript的函数式编程基础指南
- 简单理解JavaScript中的封装与继承特性
- 一次关于JSONP的小实验与总结
- 小试javascript模版mustache
- javascript属性
- JS浮点数运算BUG破法
- 多维数组json_encode之后产生对象而不是数组问题
- js关于循环中onclick绑定带参数的函数问题
- javascript当中的数据类型