常見的三種設(shè)計模式

? ? ? ? 什么是設(shè)計模式?

? ? ? 設(shè)計模式是知道開發(fā)人員按照某種現(xiàn)成的思想組織,編寫代碼的一種程序架構(gòu)方式是一,套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié);

? ? ? 為什么寫程序需要使用設(shè)計模式一般來說 在編寫程序時,不使用任何設(shè)計模式也可以實現(xiàn)各種功能,但是如果使用設(shè)計模式編寫代碼,可以讓代碼執(zhí)行效率,簡潔度,內(nèi)存利用率,程序性能等方面達到最優(yōu);

? ? ? ?例如:使用委托設(shè)計模式給標(biāo)簽添加事件時,只需要給父標(biāo)簽一個添加即可,如果不是用設(shè)計模式,就需要每個標(biāo)簽單獨添加事件,費時費力。

? ? ?第一種設(shè)計模式 ? ?單例設(shè)計模式

? ? ?在程序的生命周期中,每當(dāng)需要使用某個對象時,就調(diào)用一次創(chuàng)建該對象的方法,獲取到這個對象,而該方法只有在第一次被調(diào)用時才會真正創(chuàng)建對象,以后就直接向外返回第一次所創(chuàng)建出來的對象。

? ? ?舉例:

? ? ? ? var Person = (function(){

? ? ? ? ? ? ? ?//用來存儲唯一對象實例的指針變量

? ? ? ? ? ? ?var instance = null;

? ? ? ? ? ? ?return function(age){

? ? ? ? ? ? ? ? ? ? if(instance){

? ? ? ? ? ? ? ? ? ? ? ? ?instance.age = age;

? ? ? ? ? ? ? ? ? ? ? ? return instance;

? ? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? //第一次調(diào)用new Person()

? ? ? ? ? ? ? ? ? ? this.age = age;

? ? ? ? ? ? ? ? ? ? ?instance = this;

? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? })();

? ? ? ? ? ? ? ? var person1 = new Person(18);

? ? ? ? ? ? ? ?console.log(person1 instanceof ?Person);

? ? ? ? ? ? ? var person2 = new Person(20);

? ? ? ? ? ? ? var person3 = new Person(20);

? ? ? ? ? ? ?console.log(person1 === person2); //true

? ? ? ? ? ? ? console.log(person2 === person3);//true

單例模式的應(yīng)用描述如下:

每個類只有一個實例,這個實例必須通過一個廣為人知的接口,來被客戶訪問。

子類如果要擴展這個唯一的實例,客戶可以不用修改代碼就能使用這個擴展后的實例

第二種設(shè)計模式 ? ?工廠設(shè)計模式

? ? ? ? 工廠設(shè)計模式其實就是另外一種對象創(chuàng)建的模式,但是這種模式并不明確的規(guī)定使用構(gòu)造器,取而代之的是工廠的概念,一個工廠提供一個創(chuàng)建對象的公共接口,我們可以在其中指定我們想要創(chuàng)建對象的類型。

? ? ? ?舉例:

? ? ? ? ? ? ?function factory(name,age){

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?var newObj ?= {};

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //var newObj = new Object(); ?這兩種創(chuàng)建對象方式任選一種都可以

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?newObj.name = name;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?newObj.age = age;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? newObj.say ?= function(){

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? console.log(this.name);

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return newObj;里

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }

當(dāng)被應(yīng)用到下面的場景中時,工廠模式特別有用:

當(dāng)我們的對象或者組件設(shè)置涉及到高程度級別的復(fù)雜度時.

當(dāng)我們需要根據(jù)我們所在的環(huán)境方便的生成不同對象的實體時.

當(dāng)我們在許多共享同一個屬性的許多小型對象或組件上工作時.

第三種設(shè)計模式 ? ?代理設(shè)計模式

是把對一個對象的訪問, 交給另一個代理對象來操作,不想直接操作對象,可以通過其他對象來間接控制。

舉一個例子, 我在追一個MM想給她送一束花,但是我因為我性格比較靦腆,所以我托付了MM的一個好朋友來送。

實際的編程中, 這種因為性能問題使用代理模式的機會是非常多的。比如頻繁的訪問dom節(jié)點, 頻繁的請求遠程資源. 可以把操作先存到一個緩沖區(qū), 然后自己選擇真正的觸發(fā)時機.

? ? ? //創(chuàng)建創(chuàng)建對象

var XueWei =function(name){

? ? ? ? ? ? ? ? this.name = name;

? ? ? ? ? ?}

? ? ?//創(chuàng)建班長對象

var monitor = function(xueWei){

? ? ? ? ? ? ? ? ? ?this.xueWei = xueWei;

? ? ? ? ? ? ? ? ? ? //送鉆戒方法

? ? ? ? ? ? ? ? ? ? ?this.sendMarryRing = function(ring){

? ? ? ? ? ? ? ? ?console.log(this.xueWei.name+'這是禮物'+ring)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}

//送戒指的代理對象

var ProxyObj = function(xueWei){

? ? ? ? ? ? ? ? ? ? ? this.xueWei = xueWei

? ? ? ? ? ? ? ? ? ? ?//給代理添加送禮物的方法

? ? ? ? ? ? ? ? ?this.sendRing = function (ring){

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(new monitor(new XueWei('帆兒'))).sendMarryRing(ring)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ?//創(chuàng)建代理對象

? ? ? ? ? ? ? ? ?var proxy = new ProxyObj(new XueWei('帆兒'));

? ? ? ? ? ? ?proxy.sendRing('婚介')

還有個例子就是在調(diào)用ajax請求的時候,無論是各種開源庫,還是自己寫的Ajax類, 都會給xhr對象設(shè)置一個代理. 我們不可能頻繁的去操作xhr對象發(fā)請求, 而應(yīng)該是這樣.

var request = Ajax.get( ‘cgi.xx.com/xxx’ );

request.send();

request.done(function(){

});

代理模式用處:虛擬代理? ? 為了更好的用戶體驗,我們都會在原圖片未加載完成前,加上loading圖片。

? ? ? ? ? ? ? ? ? ? 合并http請求 ? 要請求的文件放到一塊,等2s一起請求加載

? ? ? ? ? ? ? ? ? ? 緩存代理? 以計算器為例,比如計算某些數(shù)的乘積,當(dāng)參數(shù)重復(fù)時,我們希望不用重復(fù)計算,直接返回 ? ? ? ? ? ? ? ? ? ? ? ? ? ? 結(jié)果

這幾種設(shè)計模式是比較常用的設(shè)計模式,可以在工作中給大大的提高效率,喜歡的朋友多多支持。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 單例模式 適用場景:可能會在場景中使用到對象,但只有一個實例,加載時并不主動創(chuàng)建,需要時才創(chuàng)建 最常見的單例模式,...
    Obeing閱讀 2,314評論 1 10
  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情,實現(xiàn)同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 8,118評論 2 17
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,544評論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,644評論 18 399
  • Chapter 6 面向?qū)ο蟮某绦蛟O(shè)計 理解對象 使用對象字面量語法創(chuàng)建對象var person = { n...
    云之外閱讀 675評論 0 1

友情鏈接更多精彩內(nèi)容