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