`

js 抽象工厂模式B

 
阅读更多
// 接口
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 clone(object) {
	function F() {
	}
	F.prototype = object;
	return new F;
}

// 抽象工厂
var AbstractFactory = (function() {
	// 抽象方法检查
	function checkImplements(object) {
		var isContain = false;
		var v_method = '';
		if (arguments.length < 2) {
			throw new Error("Function AbstractFactory.checkImplements called with "
					+ arguments.length + "arguments, but expected at least 2.");
		}
		for (var i = 1; i < arguments.length; i++) {
			var v_AbstractClass = arguments[i];
			for (key in v_AbstractClass) {
				if (!object[key] && typeof object[key] !== 'function'
						&& key != 'getFactory') {
					isContain = true;
					v_method = key;
					break;
				}
			}
		}
		if (isContain) {
			throw new Error("Function AbstractFactory.ensureImplements: object "
					+ "does not implement the AbstractFactory "
					+ "AbstractCalss. AbstractMethod "
					+ v_method
					+ " was not found.");
		}
	}
	// 选择具体工厂
	function chooesFactory(mode) {
		var factory = null;
		switch (mode) {
			case 'giant' :
				factory = GiantFactory;
				break;
			case 'cnforever' :
				factory = CnforeverFactory;
				break;
			case 'merida' :
				factory = MeridaFactory;
				break;
			default :
				throw new Error("mode not found");
		}
		checkImplements(factory, AbstractFactory)
		return factory;
	}
	return {
		getFactory : function(mode) {
			return chooesFactory(mode);
		},
		// 抽象方法
		createBicycle : function() {
			throw new Error('Unsupported operation on an abstract class:createBicycle');
		}
	}
})();
// 继承
var GiantFactory = clone(AbstractFactory);
GiantFactory = {
	// 实现父类抽象方法
	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 bicycle = AbstractFactory.getFactory(mode).createBicycle();
		bicycle.assemble();
		bicycle.wash();;
		return bicycle;
	}
}

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

分享到:
评论

相关推荐

    asp.net知识库

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

    千方百计笔试题大全

    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学习笔记-个人整理的

    {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} {...

    Java 面试宝典

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

Global site tag (gtag.js) - Google Analytics