摘要:工廠模式定義一個用于創建對象的接口,這個接口由子類決定實例化哪一個類。實現一個簡單的實現,使用如果使用對象屬性來實現以下例子中的工廠方法接受在運行時以字符串形式指定的類型,然后創建并返回所請求類型的對象。
1. 簡介
工廠模式的目的是為了創建對象,它通常在類或者類的靜態方法中實現,具有以下目標:
當創建相似對象時執行重復操作
當編譯時不知道具體類型的情況下,為工廠客戶提供一個創建對象的接口
與創建型模式類似,工廠模式創建對象(視為工廠里的產品)時無需指定創建對象的具體類。
工廠模式定義一個用于創建對象的接口,這個接口由子類決定實例化哪一個類。該模式使一個類的實例化延遲到了子類。而子類可以重寫接口方法以便創建的時候指定自己的對象類型。
這個模式十分有用,尤其是創建對象的流程賦值的時候,比如依賴于很多設置文件等。并且,你會經常在程序里看到工廠方法,用于讓子類類定義需要創建的對象類型。
2. 實現一個簡單的實現,使用IIFE:
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 tom = new Car("Tom", 2009, 20000); var dudu = new Car("Dudu", 2010, 5000);
如果使用對象屬性來實現:
var productManager = {}; productManager.createProductA = function() { this.prd = "A" console.log("Product " + this.prd); } productManager.createProductB = function() { this.prd = "B" console.log("Product " + this.prd); } productManager.factory = function(typeType) { return new productManager[typeType]; } productManager.factory("createProductA"); // Product A productManager.factory("createProductB"); // Product B
以下例子中的工廠方法接受在運行時以字符串形式指定的類型,然后創建并返回所請求類型的對象。
function CarMaker() {} CarMaker.prototype.drive = function() { return `I have ${this.doors} doors!` } CarMaker.factory = function(type) { const constr = type if (typeof CarMaker[constr] !== "function") { throw new Error(`${constr} doesnot exist`) } // 原型繼承的方式使得原型繼承父類 if (typeof CarMaker[constr].prototype.drive !== "function") { CarMaker[constr].prototype = new CarMaker() } return new CarMaker[constr]() } CarMaker.Compact = function() { this.doors = 4} CarMaker.Convertible = function() { this.doors = 2} const corolla = CarMaker.factory("Compact") corolla.drive() // "I have 4 doors!"
也可以把實際對象的創建工作放到原型中:
const Factory = function(type, content) { return (this instanceof Factory) ? new this[type](content) : new Factory(type, content) } Factory.prototype.Compact = function(content) { this.doors = 4} Factory.prototype.Convertible = function(content) { this.doors = 2} Factory.prototype.Compact.prototype.drive = function() { return `I have ${this.doors} doors!` } const corolla = Factory("Compact") corolla.drive() // "I have 4 doors!"3. 總結
那么什么時候使用工廠模式呢,以下幾種情景下工廠模式特別有用:
對象的構建十分復雜
需要依賴具體環境創建不同實例
處理大量具有相同屬性的小對象
什么時候不該用工廠模式:
不濫用運用工廠模式,有時候僅僅只是給代碼增加了不必要的復雜度,同時使得測試難以運行下去。
本文是系列文章,可以相互參考印證,共同進步~
JS 抽象工廠模式
JS 工廠模式
JS 建造者模式
JS 原型模式
JS 單例模式
JS 回調模式
JS 外觀模式
JS 適配器模式
JS 利用高階函數實現函數緩存(備忘模式)
JS 狀態模式
JS 橋接模式
JS 觀察者模式
網上的帖子大多深淺不一,甚至有些前后矛盾,在下的文章都是學習過程中的總結,如果發現錯誤,歡迎留言指出~
參考:
深入理解JavaScript系列(28):設計模式之工廠模式
《JS 模式》
《Javascript 設計模式》 - 張榮銘
PS:歡迎大家關注我的公眾號【前端下午茶】,一起加油吧~
另外可以加入「前端下午茶交流群」微信群,長按識別下面二維碼即可加我好友,備注加群,我拉你入群~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/92104.html
摘要:首先吧之前的代碼打包成一個新的設計模式公用代碼工廠模式要點工廠接口是工廠方法模式的核心,與調用者直接交互用來提供產品。適用場景在任何需要生成復雜對象的地方,都可以使用工廠方法模式。 工廠模式 之前講了接口,封裝,繼承,單例等,現在就需要應用這些特性來完成一些設計模式了。首先吧之前的代碼打包成一個新的JS DesignPattern.js // 設計模式公用代碼 exports...
摘要:參考文章深入理解三種工廠模式工廠模式,工廠方法模式,抽象工廠模式詳解工廠模式是中最常用的設計模式之一。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的最佳方式。 參考文章:深入理解java三種工廠模式工廠模式,工廠方法模式,抽象工廠模式 詳解 工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的...
摘要:抽象工廠模式抽象工廠是工廠模式的升級版,他用來創建一組相關或者相互依賴的對象。代碼抽象工廠模式抽象工廠的優點抽象工廠模式除了具有工廠方法模式的優點外,最主要的優點就是可以在類的內部對產品族進行約束。 抽象工廠模式 抽象工廠是工廠模式的升級版,他用來創建一組相關或者相互依賴的對象。上節學習了工廠模式,類的創建依賴工廠類,程序需要擴展時,我們必須創建新的工廠類。工廠類是用來生產產品的,那我...
摘要:抽象工廠模式可以向客戶端提供一個接口,使客戶端在不必指定產品的具體的情況下,創建多個產品族中的產品對象。前邊的兩個都是直接生產實例的,開始以為抽象工廠也是但是后來發現抽象工廠更像是生產工廠,其實抽象工廠其實是實現子類繼承父類的方法。 創建型模式 創建型模式是對一個類的實例化過程進行了抽象,把對象的創建和對象的使用進行了分離 上一篇介紹了下單例模式,這一篇介紹一下工廠模式和抽象工廠模式,...
閱讀 2008·2019-08-29 16:27
閱讀 1377·2019-08-29 16:14
閱讀 3380·2019-08-29 14:18
閱讀 3461·2019-08-29 13:56
閱讀 1260·2019-08-29 11:13
閱讀 2128·2019-08-28 18:19
閱讀 3447·2019-08-27 10:57
閱讀 2283·2019-08-26 11:39