学习一个东西,一定要明白这个东西的概念是什么,这个东西被提出来的目的是什么
在之前,我们介绍过简单工厂设计模式,简单工厂设计模式存在唯一的工厂类,它的优点是所有产品类的实例化集中管理,便于理解。当产品数量较少,且不会经常发生变化时,我们当然可以直接使用简单工厂模式,但是有的时候,需求是在时刻变化的,产品类也可能随之增加,如果使用简单工厂模式,就避免不了去修改工厂类的代码。要解决这个问题,就得使用今天所讲的,工厂方法模式。
工厂方法模式本意是将实际创建对象的工作推迟到子类当中。这样核心类就成为了抽象类。
工厂方法模式:不再有一个唯一的工厂类就创建产品,而是将不同的产品交给对应的工厂子类去实现。每个产品由负责生产的子工厂来创造。如果添加新的产品,需要做的是添加新的子工厂和产品,而不需要修改其他的工厂代码。
工厂方法模式主要有三种类组成:
- 抽象工厂类:负责定义创建产品的公共接口
- 产品子工厂:继承抽象工厂类,实现抽象工厂类提供的接口
- 每一种产品各自的产品类
安全模式类就是可以屏蔽对类的错误使用而造成的后果。说白了,就是在构造函数开始时先判断当前对象this指向是不是类。
var Demo = function() {
if(!(this instanceof Demo)){
return new Demo();
}
}
Demo.prototype.show = function() {
console.log('show')
}
var d = Demo();
d.show();
简单工厂模式仅仅适用于创建比较少的对象,如果需要创建多个类,并且会经常修改,像我们之前说的简单工厂的方法就不是很实用了,因为如果我要多添加一个类,就需要修改两个地方,所以这里我们采用工厂方法模式
var Factory = function(type,content) {
if(this instanceof Factory){
var temp = new this[type](content);
}else{
return new Factory(type,content);
}
}
//在工厂原型中设置创建所有类型数据对象的基类
Factory.prototype = {
constructor:Factory,
Java:function(content) {
//...
},
JavaScript:function(content) {
//...
},
UI:function(content) {
this.content = content;
(function(content) {
var div = document.createElement('div');
div.innerHTML = content;
div.style.border = '1px solid red';
document.getElementById(content).appendChild(div);
})(content)
}
}
如上,我们就可以创建多个类了
var data = [
{type:'JavaScript',content:'Javascript还是很重要的'},
{type:'Java',content:'Java培训哪家强'},
{type:'UI',content:'UI...'}
];
for(var i = 0,length=data.length;i++;i<data.length){
Factory(data[i].type,data[i].content);
}