JavaScript 三种工厂模式
标签(空格分隔): JavaScript
- 简单工厂模式是工厂函数返回实例化对象或者对象,工厂函数作为一个方法。
- 工厂方法模式是工厂函数不作改变,将子类放在工厂原型中;工厂函数返回对应的实例化对象:
return new this[type]();
。不同于简单工厂,工厂函数需要实例化使用。- 抽象工厂模式是工厂函数直接返回抽象类,那么这个类就不能实例化使用,需要做出对应的提示比如"抽象方法不能调用",抽象类的方法必须要通过子类重写。抽象工厂函数作为一个方法不需要实例化,通过点语法在抽象工厂上添加属性。
1. 简单工厂模式
简单工厂模式(Simple Factory),也叫静态工厂方法,由一个工厂对象决定创建某一种产品对象类的实例。主要用来创建同一类对象。
var Opera = function () {
this.description = '歌剧很好听~';
}
Opera.prototype.getDesc = function () {
console.info('你造吗, ' + this.description);
}
var Dance = function () {
this.description = '舞蹈很好看~';
}
Dance.prototype.getDesc = function () {
console.info('你造吗, ' + this.description);
}
var Crosstalk = function () {
this.description = '相声很有趣~';
}
Crosstalk.prototype.getDesc = function () {
console.info('你造吗, ' + this.description);
}
var ArtFactory = function (name) {
var art = null;
switch (name) {
case 'Opera':
art = new Opera();
break;
case 'Dance':
art = new Dance();
break;
case 'Crosstalk':
art = new Crosstalk();
break;
}
return art;
}
// 简单工厂应用
var dance = ArtFactory('Dance');
console.log(dance);
console.log(dance.description);
dance.getDesc();
// Result
// Dance {description: "舞蹈很好看~"}
// 舞蹈很好看~
// 你造吗, 舞蹈很好看~
简单工厂模式的理念就是创建对象;当子类有相同的地方可以抽象提取出来共用,可以简单创建一个对象,然后通过这个对象大量拓展方法和属性,并在最终将对象返回出来。
function createBook(name, time, type) {
var obj = new Object();
obj.name = name;
obj.time = time;
obj.type = type;
obj.getName = function () {
console.info(this.name);
}
switch (type) {
case 'js':
obj.description = 'JavaScript是世界上最好的语言!';
obj.getName = function () {
console.info('呵呵,' + this.name + '才是世界上最好的语言!');
}
break;
case 'php':
obj.description = 'PHP是世界上最好的语言!';
break;
case 'c#':
obj.description = 'c#是世界上最好的语言!';
break;
case 'java':
obj.description = 'Java是世界上最好的语言!';
break;
default:
obj.description = 'Python是世界上最好的语言!';
break;
}
return obj;
}
var book = createBook('JavaScript', '2017-01-01', 'js');
console.log(book);
console.log(book.description);
book.getName();
// Result
// {name: "JavaScript", time: "2017-01-01", type: "js", getName: ƒ, description: "JavaScript是世界上最好的语言!"}
// JavaScript是世界上最好的语言!
// 呵呵,JavaScript才是世界上最好的语言!
2. 工厂方法模式
工厂方法模式(Factory Method),将实际创建对象工作推迟到子类当中,即将创建对象的基类放在工厂方法类的原型中,这样核心类就成了抽象类(非严格意义上的)。
// 工厂方法模式
var Factory = function (type, content) {
if (this instanceof Factory) {
var ad = new this[type](content);
return ad;
} else {
return new Factory(type, content);
}
}
Factory.prototype = {
Java: function (content) {
console.info('Java, ' + content);
},
FrontEnd: function (content) {
console.info('前端, ' + content);
},
PHP: function (content) {
console.info('PHP, ' + content);
},
UI: function (content) {
console.info('UI, ' + content);
}
}
// 工厂方法模式应用
var datas = [
{ type: 'Java', content: '只要学好了Java,走遍天下都不怕!' },
{ type: 'FrontEnd', content: '月薪20k!' },
{ type: 'PHP', content: '世界上最好的语言!' },
{ type: 'UI', content: '我想要一种五彩斑斓的黑色!' }
];
datas.forEach(function (data, idnex) {
var ad = new Factory(data.type, data.content);
});
// Result
// Java, 只要学好了Java,走遍天下都不怕!
// 前端, 月薪20k!
// PHP, 世界上最好的语言!
// UI, 我想要一种五彩斑斓的黑色!
3. 抽象工厂模式
抽象工厂模式(Abstract Factory),通过对类的工厂抽象,使其业务用于对产品类簇的创建,而不负责某一具体类产品的实例。
抽象类(abstract)是一种声明但不能使用的类,当使用时会抛出错误;在js中需要手动抛出错误提示。
因为抽象工厂是个方法不需要实例化对象,故只需要一份,因此直接为抽象工厂添加类的属性即可。
抽象工厂其实是一个实现子类继承父类的方法。
// 抽象工厂方法
var VehicleFactory = function (subType, superType) {
// 判断抽象工厂中是否有该抽象类
if (typeof VehicleFactory[superType] === 'function') {
// 缓存类
var F = function () {}
// 继承父类属性和方法
F.prototype = new VehicleFactory[superType]();
// 将子类constructor指向子类
subType.constructor = subType;
// 子类原型继承父类
subType.prototype = new F();
subType.uber = superType.prototype;
} else {
throw new Error('未创建该抽象类!');
}
}
// 抽象父类 - 1
VehicleFactory.Car = function () {
this.type = 'car';
}
VehicleFactory.Car.prototype = {
getPrice: function () {
return new Error('抽象方法不能调用!');
},
getSpeed: function () {
return new Error('抽象方法不能调用!');
}
}
// 抽象父类 - 2
VehicleFactory.Truck = function () {
this.type = 'truck';
}
VehicleFactory.Truck.prototype = {
getPrice: function () {
return new Error('抽象方法不能调用!');
},
getSpeed: function () {
return new Error('抽象方法不能调用!');
}
}
// 子类 - 1
var BMW = function (price, speed) {
this.price = price;
this.speed = speed;
}
// 抽象工厂实现对 Car 抽象类的继承
VehicleFactory(BMW, 'Car');
// 必须在抽象实现后重写
BMW.prototype.getPrice = function () {
console.info('$' + this.price);
}
BMW.prototype.getSpeed = function () {
console.info(this.speed + 'km/h');
}
// 子类 - 2
var Lamborghini = function (price, speed) {
this.price = price;
this.speed = speed;
}
VehicleFactory(Lamborghini, 'Car');
Lamborghini.prototype = {
getPrice: function () {
console.info('$' + this.price);
},
getSpeed: function () {
console.info(this.speed + 'km/h');
},
getNumber: function () {
console.info('888');
}
}
// 抽象工厂模式应用
var car = new BMW('1,000,000', '500');
console.log(car);
console.log(car.price);
car.getPrice();
car.getSpeed();
// Result
// BMW {price: "1,000,000", speed: "500"}
// 1,000,000
// $1,000,000
// 500km/h
var car_2 = new Lamborghini('2,000,000', '600');
console.log(car_2);
car_2.getPrice();
car_2.getSpeed();
car_2.getNumber();
// Result
// Lamborghini {price: "2,000,000", speed: "600"}
// $2,000,000
// 600km/h
// 888
JavaScript 三种工厂模式的更多相关文章
- 三种工厂模式的分析以及C++实现
三种工厂模式的分析以及C++实现 以下是我自己学习设计模式的思考总结. 简单工厂模式 简单工厂模式是工厂模式中最简单的一种,他可以用比较简单的方式隐藏创建对象的细节,一般只需要告诉工厂类所需要的类型, ...
- java三种工厂模式
适用场合: 7.3 工厂模式的适用场合 创建新对象最简单的办法是使用new关键字和具体类.只有在某些场合下,创建和维护对象工厂所带来的额外复杂性才是物有所值.本节概括了这些场合. 7.3.1 动态实现 ...
- java设计模式---三种工厂模式之间的区别
简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...
- java设计模式三种工厂模式简单介绍
一.简单工厂模式 概述:简单工厂模式的创建意图就是,把对类的创建初始化全都交给一个工厂来执行,而用户不需要去关心创建的过程是什么样的,只用告诉工厂我想要什么就行了.而这种方法的缺点也很明显,违背了设计 ...
- java设计模式---三种工厂模式
工厂模式提供创建对象的接口. 工厂模式分为三类:简单工厂模式(Simple Factory), 工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory).GOF在 ...
- C++ 三种工厂模式
工厂模式是将带有继承于基类的子类的创建过程交于一个工厂来创建,通过赋予不同的创建标识来创建不同的子类. 基于自己的理解和使用这里巩固一下工厂模式. 我们的项目目前使用最多的是简单工厂模式,不过其他两种 ...
- java 三种工厂模式
一.简单工厂模式 一个栗子: 我喜欢吃面条,抽象一个面条基类,(接口也可以),这是产品的抽象类. public abstract class INoodles { /** * 描述每种面条啥样的 */ ...
- 深入理解Java的三种工厂模式
一.简单工厂模式 简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现.被创建实例的类型可以是接口.抽象类,也可以是具体的类 实现汽车接口 public interface Car { S ...
- Java的三种工厂模式
一.简单工厂模式 简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现.被创建实例的类型可以是接口.抽象类,也可以是具体的类 实现汽车接口 //产品接口 //汽车需要满足一定的标准 pub ...
随机推荐
- 洛谷 P1155 【NOIP2008】双栈排序
题目链接 题解 这题有点神啊.. 我们仔细观察一下,发现两个栈内元素必须为降序 那么有结论 如果有\(i < j < k\) 且 \(a[k] < a[i] < a[j]\)则 ...
- 压缩感知(CS)
总结一下最近看的压缩感知(Compressed Sensiong)的内容. 它是在采样过程中完成了数据压缩的过程. 一. 将模拟信号转换为计算机能够处理的数字信号,必然要经过采样的过程.问题在于,应该 ...
- c# MVC返回小驼峰Json(首字母小写)
1.与前端交互时,前端总希望传过去的json字段名首字母小写,但是.net规范是首字线大写 如果就写了下面的转换方法 /// <summary> /// Poco类字段名转换成首字母小写的 ...
- MySQL数据库插入中文时出现Incorrect string value: '\xE6\x97\xB7\xE5\x85\xA8' for column 'sz_name' at row 1
今天在开发时候出现了这个问题 Incorrect string value: '\xE6\x97\xB7\xE5\x85\xA8' for column 'sz_name' at row 1 场景,往 ...
- 解决matplotlib绘图中文乱码
# 指定默认字体 下面三条代码用来解决绘图中出现的乱码 matplotlib.rcParams['font.sans-serif'] = ['SimHei'] matplotlib.rcParams[ ...
- Python归纳 | 爬虫基础知识
1. urllib模块库 Urllib是python内置的HTTP请求库,urllib标准库一共包含以下子包: urllib.error 由urllib.request引发的异常类 urllib.pa ...
- Python 的 __new__()方法与实例化
__new__() 是新式类中才有的方法,它执行在构造方法创建实例之前.可以这么理解,在 Python 中类中的构造方法 __init__() 负责将类实例化,而在 __init__() 启动之前,_ ...
- 通过宏定义将__declspec(dllexport)与__declspec(dllimport)的转化,实现库代码和使用代码使用同一份头文件
我们知道,在VC编程中,如果要编译成动态链接库,需要将函数.变量.类等导出,这时使用__declspec(dllexport).使用动态链接库时,需要在声明的时候有使用__declspec(dllim ...
- Python项目中如何优雅的import
Python项目中如何优雅的import 前言 之前有一篇关于Python编码规范的随笔, 但是写的比较杂乱, 因为提到了import语句, 在篇文章中, 我专门来讲Python项目中如何更好的imp ...
- 数据类型之Nullable
Nullable 此结构在 .NET Framework 2.0 版中是新增的.