更多文章查看 本專欄
簡單工廠模式:又叫靜態工廠方法,有一個工廠對象決定建立某一種產品對象類的實例。主要用於建立同一類對象。
根據現有的需求選擇不一樣的東西。segmentfault
// 簡單的工廠模式 var redBall = function () { console.log('redBall') }; var greenBall = function () { console.log('greenBall') }; var blackBall = function () { console.log('blackBall') }; var blueBall = function () { console.log('blueBall') }; //工廠函數 var ballFactory = function (type) { switch (type) { case 'red': return new redBall(); break; case 'green': return new greenBall(); break; case 'black': return new blackBall(); break; case 'blue': return new blueBall(); break; } }
經過一個工廠產生多個同類的,或者有相同屬性可是也存在差別的產品。設計模式
function createBook(name,time,type) { var t = new Object(); t.name = name; t.time = time; t.type = type; return t; } function createBall(type,text) { var t = new Object(); t.content = text; t.show = function () { // do something } switch (type) { case 'red': // different Part break; case 'green': // different Part break; case 'black': // different Part break; case 'blue': // different Part break; } }
和類的區別:類是將初始的東西給你,而後你本身去對相應的需求進行添加實例方法。而工廠是根據你須要的方法直接生成好給你。好處,若是有大量相同的含有特殊功能的實例存在,能夠經過簡單工廠增長複用性。安全
核心:根據狀況的不一樣選擇不一樣的狀況進行處理,像是一個封裝型的'if else'。模塊化
工廠方法模式:又稱爲工廠模式,也叫虛擬構造器模式或者多態工廠模式。
它屬於類建立型模式。經過對產品類的抽象使其建立業務,只要負責用於建立多類的實例。
將實際建立對象的工做推遲到了子類當中。函數
// 類的安全模式 var Factory = function (type, content) { if(this instanceof Factory){ return new this[type](content); }else{ return new Factory(type, content); } }; // 建立不一樣類型基類的實現 Factory.prototype={ Java:function (content) { this.content = content; }, PHP:function (content) { this.content = content; }, Python:function (content) { this.content = content; }, JavaScript:function (content) { this.content = content; }, }
經過對類的工廠抽象使其業務用於對產品類簇的建立,而不負責建立某一類產品的實例。
用於產生類簇。this
建立一個類,類裏面擁有許多抽象的類,抽象的類定義了同類的類的結構。在使用的時候將抽象的類進行繼承。prototype
/** * 實現subType類對工廠類中的superType類型的抽象類的繼承 * @param subType 要繼承的類 * @param superType 工廠類中的抽象類type */ const VehicleFactory = function(subType, superType) { if (typeof VehicleFactory[superType] === 'function') { function F() { this.type = '車輛' } F.prototype = new VehicleFactory[superType]() subType.constructor = subType subType.prototype = new F() // 由於子類subType不只須要繼承superType對應的類的原型方法,還要繼承其對象屬性 } else throw new Error('不存在該抽象類') } VehicleFactory.Car = function() { this.type = 'car' } VehicleFactory.Car.prototype = { getPrice: function() { return new Error('抽象方法不可以使用') }, getSpeed: function() { return new Error('抽象方法不可以使用') } } const BMW = function(price, speed) { this.price = price this.speed = speed } VehicleFactory(BMW, 'Car') // 繼承Car抽象類 BMW.prototype.getPrice = function() { // 覆寫getPrice方法 console.log(`BWM price is ${this.price}`) } BMW.prototype.getSpeed = function() { console.log(`BWM speed is ${this.speed}`) } const baomai5 = new BMW(30, 99) // baomai5.getPrice() // BWM price is 30 // baomai5 instanceof VehicleFactory.Car // true
將一個複雜對象的構建層與其表示層相互分離,一樣的構造過程可採用不一樣的表示。
關注產生過程,將對象的建立分爲模塊化建立,自定義度變高。設計
建造一個電腦:code
// 構建基本主體 const basicComputer = function () { } basicComputer.prototype = { // 自定義的一些原型方法 } // 構建CPU模塊 const cpu = function (type) { this.type = type; } cpu.prototype = { // 自定義的一些原型方法 } // 構建顯卡模塊 const graphicsCard = function (type) { this.type = type; } graphicsCard.prototype = { // 自定義的一些原型方法 } // 構建屏幕模塊 const screen = function (type) { this.type = type; } screen.prototype = { // 自定義的一些原型方法 } const computer = function () { const t = new basicComputer(); t.cpu = new cpu(); t.graphicsCard = new graphicsCard(); t.screen = new screen(); return t; }
用原型實例指向建立對象的類,使用與建立新的對象的類共享原型對象的類型以及方法。
基於繼承,將複雜的放置在函數中,簡單的共同的放置到一個構造函數中。對象
在使用的時候能夠對原型進行拓展。
代碼與繼承相似,可是核心就是將簡單的共有的放置到構造函數中,與類的思想相似。
只容許實例化一次的類。在使用的時候能夠用於建立代碼庫,建立命名空間。
單例模式實現代碼庫,產生命名空間,一次只能實例化一個。
// 一個命名空間 const A = { fun_1: { fun_1_1:function () { // do something }, }, fun_2: { // do something }, fun_3:function () { // do something } } // 空間類可爲一個代碼塊,也能夠爲更多一層次的代碼庫(命名空間)