`

js 抽象工厂模式A

 
阅读更多
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]);
	}
};
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 v_interface = arguments[i];
		if (v_interface.constructor !== Interface) {
			throw new Error("Function Interface.ensureImplements expects arguments "
					+ "two and above to be instances of Interface.");
		}

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

function extend(subClass, superClass) {
	var F = function() {
	};
	F.prototype = superClass.prototype;
	subClass.prototype = new F();
	subClass.prototype.constructor = subClass;

	subClass.superclass = superClass.prototype;
	if (superClass.prototype.constructor == Object.prototype.constructor) {
		superClass.prototype.constructor = superClass;
	}
}

var AbstractFactory = function() {
};
AbstractFactory.prototype = {
	chooesFactory : function(mode) {
		var factory = null;
		switch (mode) {
			case 'giant' :
				factory = new GiantFactory();
				break;
			case 'cnforever' :
				factory = new CnforeverFactory();
				break;
			case 'merida' :
				factory = new MeridaFactory();
				break;
			default :
				throw new Error("mode not found");
		}
		return factory;
	},
	createBicycle : function() {
		throw new Error('Unsupported operation on an abstract class:createBicycle');
	}
};
var GiantFactory = function() {
};
extend(GiantFactory, AbstractFactory);
GiantFactory.prototype = {
	createBicycle : function() {
		var giantBicycle = new GiantBicycle();
		Interface.ensureImplements(giantBicycle, Bicycle);
		return giantBicycle;
	}
};
var Bicycle = new Interface("Bicycle", ['assemble', 'wash', 'ride', 'repair']);
var GiantBicycle = function() {

};
GiantBicycle.prototype = {
	assemble : function() {
		alert('清洗');
	},
	wash : function() {
		alert('组装');
	},
	ride : function() {

	},
	repair : function() {

	}
};

var BicycleShop = function() {
};
BicycleShop.prototype = {
	sellBicycle : function(mode) {
		var abstractFactory = new AbstractFactory();
		var factory = abstractFactory.chooesFactory(mode);
		var bicycle = factory.createBicycle();
		bicycle.assemble();
		bicycle.wash();;
		return bicycle;
	}
}

var bicycleShop = new BicycleShop();
bicycleShop.sellBicycle('giant');

分享到:
评论

相关推荐

    简单过过Javascript设计模式(上)

    前言 设计模式可不是几篇文章能够说明白的,这篇文章也是我的学习笔记吧。 构造器模式 最简单的设计模式,其实就是我们常见的:...工厂模式基于构造器模式: function User(name, position, work) { this.name = name;

    asp.net知识库

    泛型技巧系列:用泛型打造可复用的抽象工厂 体验.net2.0的优雅(四):Provider、策略、控制反转和依赖注入 泛型最佳实践 asp.net 2.0下嵌套masterpage页的可视化编辑 C# 2.0与泛型 动态调用对象的属性和方法——...

    亮剑.NET深入体验与实战精要2

    14.4.4 实现抽象工厂模式 519 14.4.5 工厂模式的三层架构图 521 本章常见技术面试题 522 职场智慧之程序员的职业规划 523 本章小结 524 第15章 大型网站的性能优化与安全 525 15.1 高效C#编码优化 526 15.2 页面...

    亮剑.NET深入体验与实战精要3

    14.4.4 实现抽象工厂模式 519 14.4.5 工厂模式的三层架构图 521 本章常见技术面试题 522 职场智慧之程序员的职业规划 523 本章小结 524 第15章 大型网站的性能优化与安全 525 15.1 高效C#编码优化 526 15.2 页面...

    Java学习笔记-个人整理的

    {2.9}抽象与接口}{59}{section.2.9} {2.10}访问控制}{60}{section.2.10} {2.10.1}类的属性}{60}{subsection.2.10.1} {2.10.2}类的方法}{61}{subsection.2.10.2} {2.10.3}静态代码块}{62}{subsection.2.10.3} {...

    千方百计笔试题大全

    coreJava部分 8 1、面向对象的特征有哪些方面?...246、如何设定的weblogic的热启动模式(开发模式)与产品发布模式? 57 247、如何启动时不需输入用户名与密码? 57 248、在weblogic管理制台中对一个应用...

    java面试宝典

    java面试试题 全面 准确 带答案 coreJava部分 8 1、面向对象的特征有哪些方面?...246、如何设定的weblogic的热启动模式(开发模式)与产品发布模式? 57 247、如何启动时不需输入用户名与密码? 57 248、在...

    最新Java面试宝典pdf版

    说明工厂模式。 126 3、开发中都用到了那些设计模式?用在什么场合? 127 九. j2ee部分 127 1、BS与CS的联系与区别。 127 2、应用服务器与WEB SERVER的区别? 128 3、应用服务器有那些? 128 4、J2EE是什么? 128 5、...

    Java面试笔试资料大全

    说明工厂模式。 126 3、开发中都用到了那些设计模式?用在什么场合? 127 九. j2ee部分 127 1、BS与CS的联系与区别。 127 2、应用服务器与WEB SERVER的区别? 128 3、应用服务器有那些? 128 4、J2EE是什么? 128 5、...

    JAVA面试宝典2010

    说明工厂模式。 126 3、开发中都用到了那些设计模式?用在什么场合? 127 九. j2ee部分 127 1、BS与CS的联系与区别。 127 2、应用服务器与WEB SERVER的区别? 128 3、应用服务器有那些? 128 4、J2EE是什么? 128 5、...

    Java面试宝典-经典

    说明工厂模式。 126 3、开发中都用到了那些设计模式?用在什么场合? 127 九. j2ee部分 127 1、BS与CS的联系与区别。 127 2、应用服务器与WEB SERVER的区别? 128 3、应用服务器有那些? 128 4、J2EE是什么? 128 5、...

    java面试题大全(2012版)

    说明工厂模式。 126 3、开发中都用到了那些设计模式?用在什么场合? 127 九. j2ee部分 127 1、BS与CS的联系与区别。 127 2、应用服务器与WEB SERVER的区别? 128 3、应用服务器有那些? 128 4、J2EE是什么? 128 5、...

    Java面试宝典2010版

    说明工厂模式。 126 3、开发中都用到了那些设计模式?用在什么场合? 127 九. j2ee部分 127 1、BS与CS的联系与区别。 127 2、应用服务器与WEB SERVER的区别? 128 3、应用服务器有那些? 128 4、J2EE是什么? 128 5、...

    Java面试宝典2012版

    1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。 61 2、编写一个程序,将d:\java目录下的所有.java文件复制到...

    java面试宝典2012

    各种java面试题集,面试前必备哦, 1. Java基础部分 7 ...说明工厂模式。 138 3、开发中都用到了那些设计模式?用在什么场合? 138 九. j2ee部分 139 1、BS与CS的联系与区别。 139 2、应用服务器与WEB SERVER的区别?...

    Java面试宝典2012新版

    说明工厂模式。 126 3、开发中都用到了那些设计模式?用在什么场合? 127 九. j2ee部分 127 1、BS与CS的联系与区别。 127 2、应用服务器与WEB SERVER的区别? 128 3、应用服务器有那些? 128 4、J2EE是什么? 128 5、...

    Java 面试宝典

    37、下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d"; .................. 25 38、try {}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会不 会被执行,什么时候被执行,在 ...

Global site tag (gtag.js) - Google Analytics