JS学习笔记(三) 工厂模式

学习书籍:《JavaScript设计模式》

学习目标:

  • 工厂模式

学习内容:

  • 简单工厂模式

function createPop(type, text){
	// 创建一个对象,并对对象拓展属性和方法
	var o = new Object();
	o.content = text;
	o.show = function(){};
	if (type == 'alert'){
		// 警示框差异部分
	}
	if (type == 'prompt'){
		// 提示框差异部分
	}
	if (type == 'confirm'){
		// 确认框差异部分
	}
	// 将对象返回
	return o;
}
// 创建警示框
var userNameAlert = createPop('alert', '用户名只能是26个字母和数字');
/* 
简单工厂模式的理念就是创建对象,对不同功能的相似的提取,不相似的针对处理(逻辑上和多态有点像)
 */
  • 工厂方法模式

/*
工厂方法模式本意是将实际创建对象工作推迟到子类中,这样核心类就成了抽象类。但JavaScript无法传统创建抽象类,所以在JavaScript中实现工厂方法模式只需要参考其核心思想即可。
*/
// 安全模式创建的工厂类
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 = {
	Java : function(content) {},
	JavaScript : function(content) {},
	UI : function(content) {
		this.content = content;
		(function(content){
			var div = document.createElement('div');
			div.innerHTML = content;
			div.style.broder = '1px solid red';
			document.getElementByle('container').appendChild(div);
		})(content);
	},
	PHP : function(content) {}
};
/* 
如果想要添加其他类时,就可以直接在Factory这个工厂类的原型里面写就可以了。
 */
  • 抽象工厂模式

/* 	抽象类
	抽象类是一种声明但不能使用的类,当你使用时就会报错。JavaScript无法像传统面向对象语言那样轻松地创建抽象类,但是可以在类的方法中手动地抛出错误来模拟抽象类
 */
// 汽车抽象类
var Car = function(){};
Car.prototype = {
	getPrice : function() {
		renturn new Error('抽象方法不能调用')
	},
	getSpeed : function() {
		renturn new Error('抽象方法不能调用')
	},
};
/* 
我们创建的这个Car类其实什么都不能做,创建时没有任何属性,并且原型prototype上的方法也不能使用;
但在继承上却很有用因为定义了一种类,并定义了该类必备的方法,如果在子类中没有重写这些方法,那么在调用时能找到这些方法便会报错。
这一特点很有必要,对于忘记重写子类的这些错误遗漏的避免是很有帮助的。这也是抽象类的一个作用,即定义一个产品簇,并声明一些必备方法。如果子类没有重写就会报错。
 */


/* 抽象工厂模式 抽象工厂其实是一个实现子类继承父类的方法 */
// 抽象工厂方法
var VehicleFactory = function(subType, superType){
	// 判断抽象工厂中是否有抽象类
	if (typeof VehicleFactory[superType] === 'function'){
		// 缓存类
		function F(){};
		// 继承父类属性和方法
		F.prototype = new VehicleFactory[superType]();
		// 将子类constructor指向子类
		subType.constructor = subType;
		// 子类原型继承"父类"
		subType.prototype = new F();
	}else{
		// 不存在该抽象类抛出异常
		throw new Error('未创建该抽象类')
	}
}
// 小汽车类
VehicleFactory.Car = function() {
	this.type = 'car';
};
VehicleFactory.Car.prototype = {
	getPrice : function() {
		renturn new Error('抽象方法不能调用')
	},
	getSpeed : function() {
		renturn new Error('抽象方法不能调用')
	}
};
// 公交车类
VehicleFactory.Bus= function() {
	this.type = 'bus';
};
VehicleFactory.Bus.prototype = {
	getPrice : function() {
		renturn new Error('抽象方法不能调用')
	},
	getSpeed : function() {
		renturn new Error('抽象方法不能调用')
	}
};
// 宝马汽车子类
var BMW = function(price, speed){
	this.price = price;
	this.speed = speed;
}
// 抽象工厂实现对Car抽象类的继承
VehicleFactory(BMW, 'Car');
BMW.prototype.getPrice = function(){
	return this.price;
}
BMW.prototype.getSpeed  = function(){
	return this.speed ;
}
/*
通过传递子类以及要继承父类(抽象类)的名称,并在抽象工厂方法中增加了一次对抽象类存在性的一次判断,如果存在则将子类继承父类的方法,然后子类通过寄生式继承。
对抽象工厂添加抽象类也很特殊,因为抽象工厂是个方法不需要实例化对象,因此直接为抽象工厂添加类的属性即可。
抽象工厂是用来创建子类的,如果我们需要一些产品子类,只需要让子类继承相应的产品簇抽象类即可。 
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值