Javascript設計模式之抽象工廠(三)

創建型設計模式-抽象工廠模式

定義

通過對類的工廠抽象使其業務用於對產品類蔟的創建,而不用負責創建某一類產品的實例。
談及抽象工廠模式,就必然需要說明下何謂抽象類呢?接觸過面向對象編程的語言的人,比如java,c#等。應該都知道他們對於抽象類擁有着關鍵字abstract class,所謂抽象,就是父類抽象共通方法特性,但是具體實現由每個子類去實現該方式。 如果沒有實現該父類的方法,則父類應該提示子類,其特性存在未實現的

抽象類說明 —————》代碼示例

function AbstractClass (){
  this.name = 'This is a abstractClass';
}
AbstractClass.prototype = {
     getName : function(){
        return new Error('抽象方法無法調用');
     },
     getInfo : function(){
        return new Error('抽象方法無法調用');
     }    
}

抽象工廠模式

這裏我直接板書書上案例進行說明。

//這裏是一個抽象工廠方法,內部單純的實現繼承的方法。
let VehicleFactory = function (SubType, SuperType) {
        if (typeof VehicleFactory[SuperType] === 'function') {
            console.log(`That's true`);
            // 緩存類
            function F () {
            };
            F.prototype = new VehicleFactory[SuperType]();
            SubType.constructor = SubType;
            SubType.prototype = new F();
        } else {
            return new Error('未創建該對象');
        }

    }
    // 小汽車的抽象類
    VehicleFactory.Car = function () {
        this.type = 'car';
    }
    VehicleFactory.Car.prototype = {
        getPrice () {
            return new Error('抽象方法不能調用');
        },
        getSpeed () {
            return new Error('抽象方法不能調用');
        }
    }
    // 公交車 抽象類
    VehicleFactory.Bus = function () {
        this.type = 'bus';
    }
    VehicleFactory.Bus.prototype = {
        getPrice () {
            return new Error('抽象方法不能調用');
        },
        getPassengerNumber () {
            return new Error('抽象方法不能調用');
        }
    }
   // 卡車 抽象類
    VehicleFactory.Truck = function () {
        this.type = 'truck';
    }
    VehicleFactory.Truck.prototype = {
        getPrice () {
            return new Error('抽象方法不能調用');
        },
        getTrainload () {
            return new Error('抽象方法不能調用');
        }
    }

抽象方法的實現與調用

let BMW = function (price, speed) {
        // 調用父類構造方法,這裏書中是沒有的,需要加上,不然無法獲取父類的公有屬性
        VehicleFactory.Car.call(this);
        this.price = price;
        this.speed = speed;
    }
    VehicleFactory(BMW, 'Car'); //實現繼承
    // 重寫父類原型對象的方法,注意我們需要先繼承父類,
    // 再重寫父類的方法,否則你重寫的方法會被父類所覆蓋
    BMW.prototype = {
        getPrice () {
            return this.price;
        },
        getSpeed () {
            return this.speed;
        }
    }
    let bmw = new BMW(100000, 9999);
    console.log(bmw.getPrice());  // 100000
    console.log(bmw.type);  // car 父類公有屬性

備註:抽象工廠模式是設計模式中最爲抽象的一種,也是創建模式中唯一一種抽象化創建模式。該模式創建出的結果不是一個真實的對象實例,而是一個類蔟,它制定了類的結構,這也就區別了簡單工廠模式創建單一對象,工廠方法模式創建多類對象。當然由於Javascript 中不支持抽象化創建和虛擬方法,所以導致這種模式無法像其他對象語言中應用的那麼廣泛。

參考書籍: 《JavaScript 設計模式》張容銘
同時大家也可參考這位讀者的觀後感

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章