[toc]
### 簡單工廠模式
簡單工廠模式(Simple Factory),又叫靜態工廠方法,由一個工廠對象決定創建某一種實例,主要用來創建同一類實例。
```js
var factory = function(args){ //工廠函數,根據type類型選擇創建某一個類的實例
var o = new Object();
//所有實例共有的方法
o.func = function(){
//...
}
//指定不同的方法
if(){
o.func1 = function(){
//...
}
}else{
o.func2 = function(){
//...
}
}
return o;
}
var obj = factory(args)
```
### 工廠方法模式
工廠方法模式(Factory Methods),簡單工廠模式只適合創建單一類型的實例,工廠方法模式將實際創建對象的工作推遲到子類中。
```js
//安全模式的工廠函數(通過判斷this來判斷是否使用new關鍵字)
var Factory = function(type,content){
if(this instanceof Factory){ //如果使用new關鍵字,則查找原型鏈并創建對象
var s = new this[type](content);
return s;
}else{
return new Factory(type,content); //如果沒有使用new關鍵字
}
}
//在工廠原型中創建所有類型數據的基類,添加時只需要修改原型即可。
Factory.prototype = {
Java:function(content){
//...
},
JavaScript:function(content){
//...
},
php:function(content){
//...
}
}
```
### 抽象工廠模式
抽象工廠模式(Abstract Factory)
抽象類:是一種聲明但是不能直接使用的類
```js
//抽象工廠方法
var AbstractFactory = function(subType,SuperType){
if(type abstracFactory[subType] === 'function'){
//如果原型鏈上存在對應的抽象類
//緩存類
function F(){};
//繼承父類的方法和屬性
F.prototype = new AbstractFactory(superType)();
//子類的構造器指向子類
subType.constructor = subType;
//子類的原型指向父類
subType.prototype = new F();
}else{
throw new Error("不存在對應的抽象類")
}
}
//Car抽象類
AbstractFactory.Car = function(){
this.type = "car";
}
AbstractFactory.Car.prototype = {
getPrice:function(){},
getSpeed:function(){}
}
//Bus抽象類
AbstractFactory.Bus = function(){
this.type = "bus";
}
AbstractFactory.Bus.prototype = {
getPrice:function(){},
getSpeed:function(){}
}
```
### 建造者模式
建造者模式(Builder)將一個復雜對象構建層與表示層分離,同樣的構建過程采用不同的表示
```js
//三個類可以對參數進行解析
var Human = function(){...};
var Name = function(name){...};
var Work = function(work){...};
//在創建person時分別實例化了三個對象,然后將三個對象組合返回
var Person = function(name,work){
var _person = new Human();
_person.name = new Name(name);
_person.work = new Work(work);
return _person;
}
```
### 原型模式
原型模式(Prototype)用原型實例指向創建對象的類,可以使得新創建的實例共享原型對象的屬性以及方法
```js
var Person = function(name){
this.name = name;
}
Person.prototype = {
sayHi:function(){},
run:function(){}
}
```
### 單例模式
單例模式(Singleton)只允許實例化一次的對象類,常用來定義命名空間,用來管理代碼庫的各個模塊
```js
var A = {
Util:{
func1:function(){},
func2:function(){}
},
Tool:{
},
Ajax:{
}
}
```
在使用時候可以根據命名空間區分不同的方法避免命名沖突