JavaScript設計模式之原廠模式

來源:互聯網
上載者:User

標籤:倍增   src   調用   節點   訂單   選擇   一個   使用   邏輯   

原廠模式是一種最常用的執行個體化對象模式,是用Factory 方法代替new操作的一種模式。在原廠模式中,我們在建立對象時不會對用戶端暴露建立邏輯,並且是通過使用一個共同的介面來指向新建立的對象。因為原廠模式就相當於建立執行個體對象的new,在JavaScript中通常會使用new關鍵字來執行個體化對象,如A: a=new A(), 原廠模式也是用來建立執行個體對象的,所以以後new時就要多個心眼,是否可以考慮使用原廠模式,雖然這樣做,可能多做一些工作,但會給你系統帶來更大的可擴充性和盡量少的修改量。

 

設計意圖:定義一個建立對象的介面,讓其子類自己決定執行個體化哪一個工廠類,原廠模式使其建立過程延遲到子類進行。

 

主要解決的問題:主要解決介面選擇的問題。

 

使用情境:我們明確地計劃不同條件下建立不同執行個體時。

 

舉個現實中的例子來理解原廠模式:現在有一個產生車輛的公司,生產的產品有單車、>機車、電動車三種。市場的需求在不斷的變化,工廠是無法準確的確定當下市場需要多少的單車、>機車、電動車。如果某種車輛生產的太多,就會因為銷售不出去而造成庫存積壓嚴重的問題。所以工廠的領導會議決定:往後自由在接收到車輛的具體訂單時再生產具體的車輛,也就是說,如果接到的是單車的訂單就生產單車,接到>機車訂單就生產>機車,接到電動車訂單就生產電動車。

 

最簡單的原廠模式程式執行個體:

var Car = (function(){                    var Car = function(model, year, miles){        this.model = model;        this.year = year;        this.miles = miles;    };                    return function(model, year, miles){        return new Car(model, year, miles);    };                })();            var dika = new Car(‘Dika‘, 2008, 20000);

 

這是最簡單的原廠模式,只用於建立一種執行個體對象。

 

再來看看複雜點的執行個體:

//工廠對象var Factory = (function(){                    //工廠生產管理對象    var productManager = {};                    //生產單車    productManager.createBicycle = function(){        this.model = "Bicycle";        console.log("product Bicycle!");    };                    //生產>機車    productManager.createMoto = function(){        this.model = "Moto";        console.log("product Moto!");    };                    //生產電動車    productManager.createElectrocar= function(){        this.model = "Electrocar";        console.log("product Electrocar!");    };                    //生產函數    productManager.create = function(type){        return new productManager[type];    };                    return {        productManager: productManager    }                })();var tom = Factory.productManager.create("createMoto");

 

接下來我們再看一個在網頁中使用的一個執行個體:假如我們想在網頁面裡插入一些元素,而這些元素類型不固定,可能是圖片,也有可能是串連,甚至可能是文本,根據原廠模式的定義,我們需要定義工廠類和相應的子類:

var page = (function(){                    var dom = {};                    //子類1:處理文本    dom.Text = function(){        this.insert = function(where, text){            var txt = document.createTextNode(text);            where.appendChild(txt);        }    };                    //子類2:處理連結    dom.Link = function(){        this.insert = function(where, url){            var link = document.createElement("a");            link.href = url;            link.appendChild(document.createTextNode(url));            where.appendChild(link);        }    };                    //子類3:處理圖片    dom.Image = function () {        this.insert = function (where, url) {            var img = document.createElement(‘img‘);            img.src = url;            where.appendChild(img);        };    };                    //建立函數    dom.create = function(type){        return new dom[type];    };                    return {        dom: dom    }                })();            var t = page.dom.create(‘Text‘);t.insert(document.body, "建立文本節點");

 

原廠模式的優缺點:

優點: 1、一個調用者想建立一個對象,只要知道其名稱就可以了。 2、擴充性高,如果想增加一個產品,只要擴充一個工廠類就可以。 3、屏蔽產品的具體實現,調用者只關心產品的介面。

缺點:每次增加一個產品時,都需要增加一個具體類和對象實現工廠,使得系統中類的個數成倍增加,在一定程度上增加了系統的複雜度,同時也增加了系統具體類的依賴。這並不是什麼好事。

 

JavaScript設計模式之原廠模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.