Javascript設計模式之原廠模式

來源:互聯網
上載者:User

標籤:理念   log   tor   end   動態   ext   擷取   需求   使用   

設計模式並不是某一種語言所特有的,而是一種設計理念,現在學習Javascript的設計模式相關知識點。


原廠模式

原廠模式設計目標是:根據不同的需求建立執行個體化對象。我們將通過一個特定的需求來逐漸深入的講解工程模式的用法。

我們需要達到的一個需求是,做一個音樂播放器,這個播放器有四個按鈕,分別是上一首、下一首、播放暫停、靜音。

 

針對上面的需求,我們先按照最簡單的原廠模式寫一個方法。

 1 <script> 2     function WangyiMusicAction(action) { 3         var obj = new Object; 4         obj.vender = "網易雲音樂"; 5         obj.playingMusic = "see you again"; 6  7         switch (action) { 8             case "last": 9                 obj.information = { currentMusic: "小幸運", status: "200|404", message: "上一曲" };10                 break;11             case "next":12                 obj.information = { currentMusic: "野子", status: "200|404", message: "下一曲" };13                 break;14             case "play":15                 obj.information = { currentMusic: "see you again", status: "200|500", message: "播放" };16                 break;17             case "mute":18                 obj.information = { currentMusic: "see you again", status: "200|500", message: "靜音" };19                 break;20         }21 22         return obj;23     };24 25     /***下面是調用測試代碼***/26     var music = new WangyiMusicAction("next");27     console.log("音樂供應商:" + music.vender); // 網易雲音樂28     console.log("現正播放:" + music.playingMusic); // see you again29     console.log("執行動作:" + music.information.message); // 下一曲30     console.log("介面狀態:" + music.information.status); // 200|40431     console.log("執行動作後歌曲:" + music.information.currentMusic); //野子32 33 </script>

通過給action傳遞不同的參數,可以擷取不同的播放器狀態。

 

物件導向理念

但是上述的方法並沒有用到物件導向的理念,我們使用物件導向的思維重新修改上面的方法。

 1 <script> 2     var WangyiMusicAction = function () { 3         this.vender = "網易雲音樂"; 4         this.playingMusic = "see you again"; 5     }; 6  7     //擴充其prototype屬性 8     WangyiMusicAction.prototype = { 9         last: function () {10             this.information = { currentMusic: "小幸運", status: "200|404", message: "上一曲" };11         },12         next: function () {13             this.information = { currentMusic: "野子", status: "200|404", message: "下一曲" };14         },15         play: function () {16             this.information = { currentMusic: "see you again", status: "200|500", message: "播放" };17         },18         mute: function () {19             this.information = { currentMusic: "see you again", status: "200|500", message: "靜音" };20         }21     };22 23 24     /***下面是調用測試代碼***/25     var music = new WangyiMusicAction();26     console.log("音樂供應商:" + music.vender); // 網易雲音樂27     console.log("現正播放:" + music.playingMusic); // see you again28 29     music.next(); // 執行下一曲動作30     console.log("執行動作:" + music.information.message); // 下一曲31     console.log("介面狀態:" + music.information.status); // 200|40432     console.log("執行動作後歌曲:" + music.information.currentMusic); //野子33 34 </script>

在上述物件導向的原廠模式中,建立一個WangyiMusicAction對象,然後擴充其prototype屬性,這樣每個執行個體都會有自己的方法。

 

改進原廠模式

上面的原廠模式中,只能產生WangyiMusicAction的對象,如果我還要產生一個QQMusic和BaiduMusic,XiamiMusic,只有每個music都得寫一遍方法,這是不值得推薦的。

我們可以通過一個Factory來動態建立各種類型的Music,首先是WangyiMusicAction。

 

最佳化原廠模式

但是在上面的原廠模式中,我們發現對於不同音樂供應商共用的屬性可以封裝成一個對象,用作父類繼承。

1,定義父類

2,繼承
通過修改prototype屬性實現繼承。

3,建立Factory工廠

建立工廠動態產生WangyiMusic或者QQMusic,然後產生一個QQMusic執行個體,並調用相應的方法。

 

 1 <script> 2     //基類(父類)Music方法 3     var BaseMusic = function () { 4         this.playingMusic = "see you again"; 5         this.information = { 6             currentMusic: "", 7             status: "", 8             message: "" 9         };10     };11 12     //實現通用方法13     BaseMusic.prototype = {14         last: function () {15             this.information.currentMusic = "小幸運";16             this.information.status = "200|404";17             this.information.message = "上一曲";18         },19         next: function () {20             this.information.currentMusic = "野子";21             this.information.status = "200|404";22             this.information.message = "下一曲";23         },24         play: function () {25             this.information.currentMusic = "see you again";26             this.information.status = "200|500";27             this.information.message = "播放";28         },29         mute: function () {30             this.information.currentMusic = "see you again";31             this.information.status = "200|500";32             this.information.message = "靜音";33         }34     };35 36 37     //網易雲音樂不同於父類的構造方法38     var WangyiMusicAction = function (action) {39         this.vender = "網易雲音樂";40     };41     //通過prototype實作類別繼承42     WangyiMusicAction.prototype = new BaseMusic(); //將動作放在基類,到達代碼複用的目的43 44     //QQ音樂不同於父類的構造方法45     var QQMusicAction = function (action) {46         this.vender = "QQ音樂";47     };48     //通過prototype實作類別繼承49     QQMusicAction.prototype = new BaseMusic(); //將動作放在基類,到達代碼複用的目的50 51 52     //音樂工廠53     var MusicFactory = function (type) {54         switch (type) {55             case "wangyi":56                 return new WangyiMusicAction();57             case "qq":58                 return new QQMusicAction();59         }60     };61 62     /***下面是調用測試代碼***/63     var music = new MusicFactory("wangyi");64     console.log("音樂供應商:" + music.vender);65     console.log("現正播放:" + music.playingMusic);66 67     music.next(); // 執行下一曲動作68     console.log("執行動作:" + music.information.message);69     console.log("介面狀態:" + music.information.status);70     console.log("執行動作後歌曲:" + music.information.currentMusic);71 72 </script>

通過上述的繼承父類方案,可以最佳化代碼結構,原廠模式也使用的更加簡潔。

 

Javascript設計模式之原廠模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.