<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 返還網(wǎng)
    隨筆-140  評(píng)論-11  文章-131  trackbacks-0
    JavaScript - 設(shè)計(jì)模式(簡(jiǎn)單工廠和工廠模式)
    2008年10月18日 23:28
    經(jīng) 常一個(gè)類或者一個(gè)對(duì)象都會(huì)包含其它的對(duì)象,當(dāng)這些成員對(duì)象需要?jiǎng)?chuàng)建時(shí),通常會(huì)使用 new 關(guān)鍵字和類的構(gòu)造函數(shù)。問(wèn)題是這樣會(huì)創(chuàng)建兩個(gè)類的依賴性。下面我們來(lái)看看一個(gè)模式,它能夠幫助這兩個(gè)類解耦,并使用一個(gè)方法來(lái)決定要?jiǎng)?chuàng)建哪個(gè)類的實(shí)例。我 們討論簡(jiǎn)單工廠模式,它使用一個(gè)分離的類(經(jīng)常是一個(gè)單態(tài))來(lái)創(chuàng)建實(shí)例,還討論比較復(fù)雜的工廠模式,使用子類來(lái)決定使用哪個(gè)具體的類來(lái)實(shí)例化一個(gè)成員對(duì) 象。

    // 簡(jiǎn)單工廠
    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); // 確保實(shí)現(xiàn)接口 Bicycle
        return bicycle;
    }
    };

    var Bicycle = new Interface('Bicycle', ['assemble', 'wash', 'ride', 'repair']); // 新建一個(gè)接口,Interface 類是模仿經(jīng)典 OO 中的 Interface 的實(shí)現(xiàn),以后有機(jī)會(huì)再介紹這個(gè) Interface 的實(shí)現(xiàn),如果要運(yùn)行實(shí)例可以把有關(guān)Interface的代碼去掉

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

    //工廠模式
    var BicycleShop = function() {}; // 一個(gè)抽象類
    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.');
    }
    };

    以上是一個(gè)抽象類,不應(yīng)該被實(shí)例化,應(yīng)該通過(guò)繼承來(lái)實(shí)現(xiàn)自行車(bicycle)的生產(chǎn),工廠模式就是把成員對(duì)象的實(shí)例化延遲到他的子類,以下是一個(gè)工廠模式子類的實(shí)現(xiàn):

    var AcmeBicycleShop = function() {};
    extend(AcmeBicycleShop, BicycleShop); // 繼承函數(shù),這篇文章有介紹
    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;
    };

    // 通過(guò)工廠模式來(lái)創(chuàng)建 XMLHTTPRequest 對(duì)象
    /* AjaxHandler 接口 */
    var AjaxHandler = new Interface('AjaxHandler', ['request', 'createXhrObject']);
    /* SimpleHandler 類. */
    var SimpleHandler = function() {}; // 實(shí)現(xiàn) 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.');
    }
    };

    使用實(shí)例:
    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) 評(píng)論(0)  編輯  收藏 所屬分類: web前端開(kāi)發(fā)
    主站蜘蛛池模板: 97青青草原国产免费观看| 成年女人男人免费视频播放| 亚洲精品永久www忘忧草| 国产成人A在线观看视频免费| 无码天堂va亚洲va在线va| 亚洲午夜久久久影院伊人| 91精品视频免费| 一区二区三区视频免费| 亚洲熟妇av一区| 亚洲成a人片在线播放| 2022久久国产精品免费热麻豆| 国产成人精品亚洲一区| 久久精品亚洲一区二区三区浴池| 永久黄网站色视频免费观看| 成在人线av无码免费高潮喷水 | 亚洲七七久久精品中文国产| 免费国产污网站在线观看15| 国产一区二区三区亚洲综合| 亚洲欧洲日产专区| 亚洲一区二区视频在线观看| 成人免费无毒在线观看网站| 久久精品国产免费一区| 国产亚洲精品美女久久久久 | 亚洲午夜久久久久妓女影院| 成人免费看片又大又黄| 99re这里有免费视频精品| 香蕉国产在线观看免费| 亚洲中文无码永久免| 老司机亚洲精品影院无码| 亚洲国产精品无码久久九九| 成年人免费观看视频网站| 国产精品免费大片| 一区二区免费电影| 亚洲av日韩av永久在线观看| 亚洲成电影在线观看青青| 亚洲精品成人片在线播放| 亚洲国产高清在线一区二区三区 | 精品免费国产一区二区| 999久久久免费精品国产 | 国产精品极品美女免费观看 | 青青草原精品国产亚洲av|