JS設計模式一:工廠模式

這裏有一份簡潔的前端知識體系等待你查收,看看吧,會有驚喜哦~若是以爲不錯,懇求star哈~前端


工廠模式簡述

工廠模式,顧名思義,就是爲了創造對象。git

工廠模式相似於現實的工廠生產線,能夠生產出大量相似的商品。github

工廠模式能夠分爲簡單工廠模式跟複雜工廠模式。如下將詳細介紹。bash

簡單工廠模式

先來看一個例子~~~函數

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
複製代碼

如上代碼:函數CarFactory接受兩個參數brand, price,最終返回一個對象。若是屢次調用這個函數,每次將返回一個新的對象,這就跟工廠的生產線同樣。ui

簡單工廠模式的優勢在於:能解決多個類似的問題,減小大量冗餘代碼。this

固然,簡單工廠模式的缺點也很突出:即沒法識別對象類型(typeof car1 === 'object')spa

爲了解決簡單工廠模式沒法識別對象類型的問題,複雜工廠模式便登場了~~~prototype

複雜工廠模式

再看一個例子~~~code

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("父類是抽象類不能直接調用,須要子類重寫該方法");
            }
        };
        var CarChild = function(brand, price) {
            this.brand = brand;
            this.price = price;
            // 繼承構造函數父類中的屬性和方法
            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不在進行對象實例化,只對建立過程當中的通常性問題進行處理,ComplexCarFactory就像是Java中的抽象類,必須被子類重寫,不然調用ComplexCarFactory的sellCall方法時就會拋出異常。

CarChild繼承自ComplexCarFactory,同時重寫了父類的方法,CarChild類實例後的對象之間是相互獨立的,具體的業務邏輯會放在子類中進行編寫。

總結

工廠模式最重要的優勢是:能夠在父類實現一些相同的方法,而具體要實現的業務邏輯能夠放在子類中,經過子類重寫父類的方法,去實現本身的業務邏輯。

工廠模式弱化對象間的耦合,父類專一於實現重複性的功能,子類專一於具體的業務邏輯,這樣能夠減小冗餘代碼。

相關文章
相關標籤/搜索