摘要:前言接下來將會為大家介紹設計模式中的創建型設計模式,在此之前需要掌握一定的對象繼承基礎。但是如果是工廠方法模式的話,則只需要往工廠方法中添加基類則可以。
前言
接下來將會為大家介紹設計模式中的創建型設計模式,在此之前需要掌握一定的JavaScript對象繼承基礎。
簡單工廠模式 先說說什么是簡單工廠模式:又叫靜態工廠方法,由一個工廠對象決定創建某一種產品對象類的實例
看著定義有點懵,沒關系。繼續往下走
工廠函數說明:簡單來說,就是為了把多個相同類型的類集成到一個函數內,我們把這個函數叫做工廠函數
用途:使得其他人不用關注創建對象是基于哪個基類,直接用該工廠函數即可
代碼:
//定義小貓類 var Cat = function(){ this.voice = "喵"; } Cat.prototype.getVoice = function(){ console.log(this.voice); } //定義小狗類 var Dog = function(){ this.voice = "汪"; } Dog.prototype.getVoice = function(){ console.log(this.voice); } //動物工廠 var AnimalFactory = function(name) { switch(name){ case "cat": return new Cat(); case "dog": return new Dog(); } } //創建實例 var hellokity = AnimalFactory("cat"); hellokity.getVoice(); //"喵"
當然,上面兩種方法十分相似,于是還可以有下面的定義方式:
var createAnimal = function(name,voice) { var o = new Object(); o.name = name; o.voice = voice; o.getVoice = function() { console.log(this.voice); } return o; } var hellokity = createAnimal("hellokity","喵"); hellokity.getVoice(); //"喵"
看似最后一種方法好像簡便不少,但是實際上這兩種定義方法是有區別的。
第一種方式所定義的實例對象是擁有父類的方法,也就是可以訪問到原型鏈上面的屬性和方法的。
第二種方式定義則是因為在內部新建了一個對象,那么父級對象什么的自然也就不存在了(當然這里不是指object)。
最后回顧最后再次加深對簡單工廠模式的印象吧
簡單工廠模式:又叫靜態工廠方法,由一個工廠對象決定創建某一種產品對象類的實例
工廠方法模式 先說說什么是工廠方法模式:通過對產品類的抽象使其創建業務主要負責用于創建多類產品的實例
懵?沒關系。繼續往下走
安全模式類用途:可以屏蔽使用該類的所造成的錯誤
例子:
var Demo = function() {}; Demo.prototype.getName = function(){ console.log("get success!") } var d = Demo(); d.getName(); //報錯 //安全模式類 var Demo = function() { if(!(this instanceof Demo)){ return new Demo } }; Demo.prototype.getName = function(){ console.log("get success!") } var d = Demo(); d.getName(); //"get success!"工廠方法
實際上工廠方法和簡單工廠模式區別在于:簡單工廠模式如果需要增加類的話,那么它則需要改變兩處地方,一處是工廠函數,一處是改變類。但是如果是工廠方法模式的話,則只需要往工廠方法中添加基類則可以。代碼實現如下:
//安全模式創建的工廠類 var superHeroFatory = function(type,skill){ if(this instanceof superHeroFatory){ var s = new this[type](skill); return s }else{ return new superHeroFatory(type,skill) } } superHeroFatory.prototype = { IronMan: function(skill){ this.name = "Iron Man"; this.skill = skill; this.getName = function(){ console.log(this.name); } this.getSkill = function(){ console.log(this.skill); } }, CaptainAmerica: function(skill){ this.name = "Captain America"; this.skill = skill; this.getName = function(){ console.log(this.name); } this.getSkill = function(){ console.log(this.skill); } } } var captainAmerica = superHeroFatory("CaptainAmerica","shield"); captainAmerica.getName(); //"Captain America" captainAmerica.getSkill(); //"shield"最后回顧
這個工廠方法模式解決了創建多類對象所帶來的麻煩,這樣的工廠方法對象的方式也避免了使用者與對象類之間的耦合,用戶不關心創建該對象的具體類,只需調用工廠方法即可。
抽象工廠模式 先說說什么是抽象工廠模式:通過對類的工廠抽象使其業務用于對產品類簇的創建,而不負責創建其某一類產品的實例
看著定義有點懵,沒關系。繼續往下走
抽象類概念:抽象類是一種聲明但不能使用的類,使用就會報錯。
用途:定義一個產品簇,并聲明一些必備的方法,如果子類沒有重寫就會報錯
例子:在java中可以簡單定義,但是在js中的話暫時還沒有這種抽象類的定義,于是我們可以用這種方式模仿抽象類:
var Car = function() {}; Car.prototype = { getPrice(){ return new Error("抽象方法不可用") }, getName(){ return new Error("抽象方法不可用") } }
于是乎,在對象實例化后調用這些函數就會報錯。因為抽象類是沒有具體實現的,它只用作繼承的方式
抽象工廠模式說明:為了更好的創建抽象類,于是將抽象類整合為一個抽象工廠
用途:用于創建抽象對象的一種方法
定義:
var VehicleFactory = function(subType,superType){ if(typeof VehicleFactory[superType] === "function"){ // 緩存類 function F() { }; //繼承父類屬性和方法 F.prototype = new VehicleFactory[superType](); //子類constructor指向子類 subType.constructor = subType; //子類原型繼承“父類” subType.prototype = new F(); }else{ throw new Error("未創建該抽象類") } } //小汽車抽象類 VehicleFactory.Car = function(){ this.type = "car"; } VehicleFactory.Car.prototype = { getPrice(){ return new Error("抽象方法不可用") }, getName(){ return new Error("抽象方法不可用") } } //大巴抽象類 VehicleFactory.Bus = function(){ this.type = "bus"; } VehicleFactory.Bus.prototype = { getPrice(){ return new Error("抽象方法不可用") }, getName(){ return new Error("抽象方法不可用") } }抽象類的實現
啥也別說了,直接上碼
var BMW = function(price,name){ this.price = price; this.name = name; } VehicleFactory(BMW,"Car"); BMW.prototype.getName = function(){ console.log(this.name); } var X2 = new BMW(200,"X2"); X2.getName(); //"X2" X2.getPrice(); //報錯,因為忘記定義這個方法了最后回顧
最后再次感受一下定義吧
抽象工廠模式:通過對類的工廠抽象使其業務用于對產品類簇的創建,而不負責創建其某一類產品的實例
建造者模式 先說說什么是建造者模式:將一個復雜對象的構建層與其表示層相互分離,同樣的構建過程可采用不同的表示
與工廠模式差別工廠模式主要是為了創建對象實例或者類簇(抽象工廠),關心的是最終創建的是什么,而對創建的過程并不關心
建造者模式在創建對象時要更復雜,它更多的關心創建對象的過程甚至于每個細節。或者說這種模式創建了一個復合對象
建造者模式說明:關心創建對象的過程,對于創建的具體實現的細節也參與了干涉
用途:當需要我們創建對象不僅需要得到對象實例,還需對對象細化時,則可以使用建造者模式
代碼:
//創建類 var Human = function(props){ this.name = props && props.name || "保密"; } Human.prototype.getName = function(){ console.log(this.name); } //名字類 var Name = function(name){ var that = this; (function(name,that){ that.wholeName = name; if(name.indexOf(" ") > -1){ that.FirstName = name.slice(0,name.indexOf(" ")); that.SecondName = name.slice(name.indexOf(" ")); } })(name,that) } var Person = function(name){ var _name = new Name(name); var _person = new Human({name:_name}); return _person } var Miles = new Person("Miles Jiang"); Milse.getName(); //{wholeName: "Miles Jiang", FirstName: "Miles", SecondName: " Jiang"}最后回顧
這種模式下,我們就可以關心到對象的創建過程。因此我們通常將創建對象模塊化,這樣使得被創建的類的每個模塊都可以獲得靈活的運用和高質量的復用
單例模式 先說說什么是單例模式:又被稱為單體模式,是只允許實例化一次的對象類。有時我們也用一個對象來規劃一個命名空間,井井有條地管理對象上的屬性與方法
命名空間說明:用來約束每個人定義的變量
用途:防止共同開發時帶來的變量名沖突
例子:
var Miles = { getDom: function(id){ return document.getElementById(id) } }最后回顧
為了梳理代碼,使得代碼有序整潔
后話本文章是通過學習張榮銘所著的《JavaScript設計模式》所總結。希望大家看完文章可以學到東西,同時也推薦大家去看看這本設計模式,寫得很不錯。
成功不在一朝一夕,我們都需要努力
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108537.html
摘要:動態代理個經紀人如何代理個明星掘金在代理模式女朋友這么漂亮,你缺經紀人嗎中我們用寶強的例子介紹了靜態代理模式的概念。掘金使用從頭創建一個,這種方法比較簡單。 動態代理:1 個經紀人如何代理 N 個明星 - Android - 掘金在 代理模式:女朋友這么漂亮,你缺經紀人嗎? 中我們用寶強的例子介紹了靜態代理模式的概念。 本來我的目的是通過大家耳熟能詳的例子來加深理解,但是有些網友指責...
摘要:順帶一提,跨域可以用解決。本文主要關注一些離散的,即學即用的知識點,和一些在日常編程中容易踩得坑。不做類型轉換,所以如果比較對象的類型不一致,直接返回。當程序員給一個變量賦值為時,通常表示這個變量已經不用了。 原文:http://h01mes.com/veteran-new... 我仍然記得在一個ajax小項目踩到跨域問題(CORS)的坑,最后用Chrome插件解決。由此對Javasc...
摘要:前期準備微信小程序開發工具,以及網頁的相關知識,本章知識了解微信小程序的基本使用。首先我們需要注冊一個號。注冊好后登陸,就可以進行開發了接著就是熟悉小程序的目錄。大佬詳細教程小程序的程序員變現指南之微信小程序真的零基礎開發寶典 ...
摘要:納豆外賣,預訂座餐特點預訂在家中公司,提前選擇要去的餐廳,提前選好菜支付后,到店即可就餐外賣全城美食中餐快餐小吃等動動手指即可送到您手中。推薦經常為您推薦一些特色的美食豆圈分享你生活中的美食每刻。圖片二維碼掃描源碼地址 2016年7月2日,這是一個風輕云淡的日子,DeviceOne平臺的用戶Star將自己經過一段時間研發的產品通過官方的渠道開源出來,這不僅是對自己設計的高度自信、更是想...
閱讀 630·2021-09-24 09:48
閱讀 2492·2021-08-26 14:14
閱讀 517·2019-08-30 13:08
閱讀 1445·2019-08-29 15:22
閱讀 3066·2019-08-29 11:06
閱讀 1001·2019-08-26 18:26
閱讀 1034·2019-08-26 13:53
閱讀 2513·2019-08-26 12:21