2015年1月13日 星期二

[JS] Factory 工廠模式筆記

工廠模式是一種多重重複性的設計模式

有許多不同建構工廠模式的方法,這篇就先筆記其中一種方法
(另外一種參考資料中的  [5]  [6] 裡有)


1. 先建立個簡單的 object
(以建立貓為範例)

function cat(){
    this.version='0.3a'; //製作貓的版本
    this.make=function(){//設定完成後就可以建立喵星人
        alert(this.name);
    }
}

2.建立簡單的品種
(兩種)

cat.create_britshshorthair=function(name){ //建立品種  英國短毛貓
    this.name=name;
    this.type_name='Britsh Short Hair';
    alert('英國短毛貓'); //藍寶的品種
}

cat.create_britshlonghair=function(name){  //建立品種  英國長毛貓
    this.name=name;
    this.type_name='Britsh Long Hair';
    alert('英國長毛貓'); //Lindi的品種
}

3.建立一個喵星人工廠

cat.factory=function(type,name){
    if(typeof cat[type] !== 'function'){
        throw{
            'name':'error',
            'msg':'not exist'
        }
        return false;
    }else{
        if(typeof cat[type].prototype !=='function'){
            cat[type].prototype=new cat();
        }
        var newobj=new cat[type](name);       

        return newobj;
    }
}

至此簡單的工廠模式已經建立完成!
接著開始製作喵星人!

4.製作一隻短毛與長毛的喵星人
var bluebo=cat.factory('create_britshshorthair','bluebo');//建立一隻英國短毛貓
var lindi=cat.factory('create_britshlonghair','lindi');//建立一隻英國長毛貓

如果我們想要再多製作幾隻喵星人,就可以依照想要的類型依上面方式建立。

這樣子每隻由貓工廠製作出來的貓兒都有繼承最上層與中層的資料,
但如果要讓每隻貓兒(或相同類型)同時改變變數的話,
是無法使用 prototype 的方式更改,

如果真的很想讓整間工廠的每個單位都修改,
倒是可以使用 constructor.prototype 指令,

bluebo.constructor.prototype.val='a1';
這樣子就會將所有的結構鍊的 val 數值改成 a1

只是可能會有些非預期的資料覆蓋,
看大家寫法似乎是比較不建議使用。

以下是一張工廠模式的結構圖





















基本上  LEVEL 3  建立出來的 object 都繼承  LEVEL TOP  與  LEVEL 2  的所有參數。

附上  jsfiddle 的程式碼

http://jsfiddle.net/jim28791/h3gutsdk/1/

簡單筆記其中一種 工廠模式的方法。



參考資料:

沒有留言:

張貼留言