<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    http://www.tkk7.com/ebecket 返還網
    隨筆-140  評論-11  文章-131  trackbacks-0
    JavaScript - 設計模式(簡單工廠和工廠模式)
    2008年10月18日 23:28
    經 常一個類或者一個對象都會包含其它的對象,當這些成員對象需要創建時,通常會使用 new 關鍵字和類的構造函數。問題是這樣會創建兩個類的依賴性。下面我們來看看一個模式,它能夠幫助這兩個類解耦,并使用一個方法來決定要創建哪個類的實例。我 們討論簡單工廠模式,它使用一個分離的類(經常是一個單態)來創建實例,還討論比較復雜的工廠模式,使用子類來決定使用哪個具體的類來實例化一個成員對 象。

    // 簡單工廠
    var BicycleShop = function() {};
    BicycleShop.prototype = {
    sellBicycle: function(model) {
        var bicycle = BicycleFactory.createBicycle(model);;

        bicycle.assemble();
        bicycle.wash();
        return bicycle;
    }
    };

    var BicycleFactory = {
    createBicycle: function(model) {
        var bicycle;
        switch(model) {
          case 'The Speedster':
            bicycle = new Speedster();
            break;
          case 'The Lowrider':
            bicycle = new Lowrider();
            break;
          case 'The Flatlander':
            bicycle = new Flatlander();
            break;
          case 'The Comfort Cruiser':
          default:
            bicycle = new ComfortCruiser();
        }
        Interface.ensureImplements(bicycle, Bicycle); // 確保實現接口 Bicycle
        return bicycle;
    }
    };

    var Bicycle = new Interface('Bicycle', ['assemble', 'wash', 'ride', 'repair']); // 新建一個接口,Interface 類是模仿經典 OO 中的 Interface 的實現,以后有機會再介紹這個 Interface 的實現,如果要運行實例可以把有關Interface的代碼去掉

    var Speedster = function() { // 實現接口 Bicycle
    //
    };
    Speedster.prototype = {
    assemble: function() {
        //
    },
    wash: function() {
        //
    },
    ride: function() {
        //
    },
    repair: function() {
        //
    }
    };

    //工廠模式
    var BicycleShop = function() {}; // 一個抽象類
    BicycleShop.prototype = {
    sellBicycle: function(model) {
        var bicycle = this.createBicycle(model);
        bicycle.assemble();
        bicycle.wash();
        return bicycle;
    },
    createBicycle: function(model) {
        throw new Error('Unsupported operation on an abstract class.');
    }
    };

    以上是一個抽象類,不應該被實例化,應該通過繼承來實現自行車(bicycle)的生產,工廠模式就是把成員對象的實例化延遲到他的子類,以下是一個工廠模式子類的實現:

    var AcmeBicycleShop = function() {};
    extend(AcmeBicycleShop, BicycleShop); // 繼承函數,這篇文章有介紹
    AcmeBicycleShop.prototype.createBicycle = function(model) {
    var bicycle;
    switch(model) {
        case 'The Speedster':
          bicycle = new AcmeSpeedster();
          break;
        case 'The Lowrider':
          bicycle = new AcmeLowrider();
          break;
        case 'The Flatlander':
          bicycle = new AcmeFlatlander();
          break;
        case 'The Comfort Cruiser':
        default:
          bicycle = new AcmeComfortCruiser();
    }
    Interface.ensureImplements(bicycle, Bicycle);
    return bicycle;
    };

    // 通過工廠模式來創建 XMLHTTPRequest 對象
    /* AjaxHandler 接口 */
    var AjaxHandler = new Interface('AjaxHandler', ['request', 'createXhrObject']);
    /* SimpleHandler 類. */
    var SimpleHandler = function() {}; // 實現 AjaxHandler 接口
    SimpleHandler.prototype = {
    request: function(method, url, callback, postVars) {
        var xhr = this.createXhrObject();
        xhr.onreadystatechange = function() {
        if(xhr.readyState !== 4) return;
        (xhr.status === 200) ?
          callback.success(xhr.responseText, xhr.responseXML) :
          callback.failure(xhr.status);
        };
        xhr.open(method, url, true);
        if(method !== 'POST') postVars = null;
        xhr.send(postVars);
    },
    createXhrObject: function() { // Factory method.
        var methods = [
        function() { return new XMLHttpRequest(); },
        function() { return new ActiveXObject('Msxml2.XMLHTTP'); },
        function() { return new ActiveXObject('Microsoft.XMLHTTP'); }
        ];
        for(var i = 0, len = methods.length; i < len; i++) {
          try {
            methods[i]();
          }
          catch(e) {
            continue;
          }
          // If we reach this point, method[i] worked.
          this.createXhrObject = methods[i]; // Memoize the method.
          return methods[i];
        }
        // If we reach this point, none of the methods worked.
        throw new Error('SimpleHandler: Could not create an XHR object.');
    }
    };

    使用實例:
    var myHandler = new SimpleHandler();
    var callback = {
    success: function(responseText) { alert('Success: ' + responseText); },
    failure: function(statusCode) { alert('Failure: ' + statusCode); }
    };
    myHandler.request('GET', 'script.php', callback);
    posted on 2009-11-01 11:47 becket_zheng 閱讀(737) 評論(0)  編輯  收藏 所屬分類: web前端開發
    主站蜘蛛池模板: 日本xxxx色视频在线观看免费| 又大又硬又粗又黄的视频免费看| 亚欧免费一级毛片| 国产亚洲精品精品国产亚洲综合| 一级毛片免费播放男男| 亚洲真人日本在线| caoporm超免费公开视频| 久久亚洲中文字幕精品一区四| 久久毛片免费看一区二区三区| 亚洲精品高清无码视频| 日韩精品免费视频| 亚洲色av性色在线观无码| 无码区日韩特区永久免费系列| 亚洲男人天堂2018av| 欧洲精品免费一区二区三区| 美女视频黄a视频全免费网站色 | 大地资源在线观看免费高清| 亚洲精品亚洲人成在线播放| 国产精品酒店视频免费看| 无码AV动漫精品一区二区免费| 亚洲va无码手机在线电影| 99ee6热久久免费精品6| 亚洲国产区男人本色在线观看| 在线永久免费观看黄网站| 2022免费国产精品福利在线| 亚洲爆乳精品无码一区二区三区| 一区二区三区在线免费看| 亚洲欧美成人av在线观看| 亚洲国产成人久久综合碰| 一区二区三区观看免费中文视频在线播放 | 色噜噜亚洲男人的天堂| 国产免费午夜a无码v视频| 最新久久免费视频| 亚洲日本国产乱码va在线观看| 国产裸模视频免费区无码| 99久久99这里只有免费的精品| 亚洲国产精品乱码在线观看97| 免费一级毛片不卡不收费| 91av视频免费在线观看| 国产亚洲精品美女久久久久| 亚洲国产精品VA在线看黑人|