JS設(shè)計(jì)模式一:工廠模式

工廠模式簡述

工廠模式,顧名思義,就是為了創(chuàng)造對象。

工廠模式類似于現(xiàn)實(shí)的工廠生產(chǎn)線,可以生產(chǎn)出大量類似的商品。

工廠模式可以分為簡單工廠模式跟復(fù)雜工廠模式。以下將詳細(xì)介紹。

簡單工廠模式

先來看一個例子~~~

        function CarFactory (brand, price) {
            var car = new Object();
            car.brand = brand;
            car.price = price;
            car.getPrice = function () {
                return this.price;
            }
            return car;
        }
        var car1 = CarFactory("牌子A", 10000);
        var car2 = CarFactory("牌子B", 20000);
        console.log(JSON.stringify(car1)); // {"brand":"牌子A","price":10000}
        console.log(JSON.stringify(car2)); // {"brand":"牌子B","price":20000}
        console.log(typeof car1); // object
        console.log(typeof car2); // object
        console.log(car1 instanceof Object); // true

如上代碼:函數(shù)CarFactory接受兩個參數(shù)brand, price,最終返回一個對象。如果多次調(diào)用這個函數(shù),每次將返回一個新的對象,這就跟工廠的生產(chǎn)線一樣。

簡單工廠模式的優(yōu)點(diǎn)在于:能解決多個相似的問題,減少大量冗余代碼。

當(dāng)然,簡單工廠模式的缺點(diǎn)也很突出:即無法識別對象類型(typeof car1 === 'object')

為了解決簡單工廠模式無法識別對象類型的問題,復(fù)雜工廠模式便登場了~~~

復(fù)雜工廠模式

再看一個例子~~~

        function ComplexCarFactory(brand, price) {
            this.brand = brand;
            this.price = price;
        }
        ComplexCarFactory.prototype = {
            constructor: ComplexCarFactory,
            sellCar: function(){
                var speed = this.getSpeed(this.brand);
                console.log(this.brand + '的車子售價:' + this.price + '元人民幣,限速' + speed + '公里每小時');
            },
            getSpeed : function(brand){
                throw new Error("父類是抽象類不能直接調(diào)用,需要子類重寫該方法");
            }
        };
        var CarChild = function(brand, price) {
            this.brand = brand;
            this.price = price;
            // 繼承構(gòu)造函數(shù)父類中的屬性和方法
            ComplexCarFactory.call(this, brand, price);
        };
        // 子類繼承父類原型方法
        CarChild.prototype = Object.create(ComplexCarFactory.prototype);
        // CarChild 子類重寫父類的方法
        CarChild.prototype.getSpeed = function(brand){
            var speed = null;
            if(brand === '牌子C'){
                return 100;
            }
            return 50;
        }
        var car3 = new CarChild("牌子C", 3000);
        console.log(car3); // CarChild {brand: "牌子C", price: 3000}
        console.log(car3.sellCar()); // 牌子C的車子售價:3000元人民幣,限速50公里每小時

如上代碼:

ComplexCarFactory為父類,CarChild為子類,CarChild繼承自ComplexCarFactory。

ComplexCarFactory不在進(jìn)行對象實(shí)例化,只對創(chuàng)建過程中的一般性問題進(jìn)行處理,ComplexCarFactory就像是Java中的抽象類,必須被子類重寫,否則調(diào)用ComplexCarFactory的sellCall方法時就會拋出異常。

CarChild繼承自ComplexCarFactory,同時重寫了父類的方法,CarChild類實(shí)例后的對象之間是相互獨(dú)立的,具體的業(yè)務(wù)邏輯會放在子類中進(jìn)行編寫。

總結(jié)

工廠模式最重要的優(yōu)點(diǎn)是:可以在父類實(shí)現(xiàn)一些相同的方法,而具體要實(shí)現(xiàn)的業(yè)務(wù)邏輯可以放在子類中,通過子類重寫父類的方法,去實(shí)現(xiàn)自己的業(yè)務(wù)邏輯。

工廠模式弱化對象間的耦合,父類專注于實(shí)現(xiàn)重復(fù)性的功能,子類專注于具體的業(yè)務(wù)邏輯,這樣可以減少冗余代碼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情,實(shí)現(xiàn)同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 8,140評論 2 17
  • 設(shè)計(jì)模式基本原則 開放-封閉原則(OCP),是說軟件實(shí)體(類、模塊、函數(shù)等等)應(yīng)該可以拓展,但是不可修改。開-閉原...
    西山薄涼閱讀 4,086評論 3 14
  • 簡單工廠模式 優(yōu)點(diǎn):能解決多個相似的問題 缺點(diǎn):不能識別對象的類型 工廠模式是為了解決多個類似對象聲明問題,也就是...
    bestvist閱讀 436評論 0 0
  • 設(shè)計(jì)模式匯總 一、基礎(chǔ)知識 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 4,095評論 1 15
  • 大事必做于細(xì),抽絲剝繭見月明 132易水寒學(xué)經(jīng)匯報 2017年9月15日 星期四 寶貝年齡:菲丫頭9歲 小蘋果3歲...
    雅筑小易閱讀 453評論 1 2

友情鏈接更多精彩內(nèi)容