javaScript設計模式-創建型設計模式

来源:https://www.cnblogs.com/z937741304/archive/2018/03/31/8681894.html
-Advertisement-
Play Games

我們大家一聽到設計模式就感覺設計模式是一個高端的東西,到底什麼是設計模式呢?其實設計模式也就是我們的前輩在寫代碼的時候遇到的問題,提出的解決方案,為了方便人與人之間的交流,取了個名字,叫做設計模式。 創建型設計模式 本文今天主要寫一部分創建型設計模式,創建型設計模式呢就是我門創建對象的時候的一種模式 ...


  我們大家一聽到設計模式就感覺設計模式是一個高端的東西,到底什麼是設計模式呢?其實設計模式也就是我們的前輩在寫代碼的時候遇到的問題,提出的解決方案,為了方便人與人之間的交流,取了個名字,叫做設計模式。

創建型設計模式

  本文今天主要寫一部分創建型設計模式,創建型設計模式呢就是我門創建對象的時候的一種模式。廢話不多說了,直接上代碼和解釋吧。

單例模式

  目的:單例模式的目的是為瞭解決全局命名空間污染,衝突。

  

 1 function g(id) {
 2     return document.getElementById(id);
 3 }
 4 
 5 function css(id,key,value) {
 6     g(id).style[key] = value;
 7 }
 8 
 9 function html(id,value) {
10     g(id).innerHTML = value;
11 }
12 
13 function on(id,type,fn) {
14     g(id)['on'+type] = fn;
15 }

 

  上面的代碼在頁面中添加了許多的變數,日後其他的人要為頁面添加新的需求時,增加代碼或者是重寫了代碼,比如這個on方法,那麼就會和其他人的代碼衝突,所以可以用單例模式來書寫一下代碼。

  代碼樣式如下

 1 //工程師 z
 2 var xiaoz = {
 3     g : function (id) {
 4         return document.getElementById(id);
 5     },
 6     css : function (id,key,value) {
 7         g(id).style[key] = value;
 8     }
 9 };
10 //工程師 y
11 var xiaoy = {
12     css : function () {
13        //一堆代碼 
14     }
15 };

這樣幾個人之間的代碼就不會相互影響了,上面的代碼調用的方式如下。

 1 xiaoz.g('box'); 

 

  在單例模式中還有另外一種,關於靜態變數在es6才提出來的const,靜態變數是一旦確定就無法修改的量,但是現在es6的相容性還不是太好,在單例模式中同樣可以模擬這種可以定義但是無法改變的變數。

  

 1 var wulv5 = (function(){
 2     var bian = {
 3         a : 1,
 4         b : 2,
 5         fn : function(){
 6             console.log('這裡是fn')
 7         }
 8     };
 9     return {
10         getdata:function(val){
11             return bian[val];
12         }
13     }
14 })();
15 //裡面的變數只能獲取 不能修改

 

簡單工廠模式

  簡單工廠模式不是解決命名空間問題的,是為瞭解決創建對象的。

  看下麵的代碼例子

  

//牛排
function Steak(){
    this.price = 30;
    this.time = 20;
}
//炒飯
function FriedRice(){
    this.price = 10;
    this.time = 5;
}
//麵條
function Noodles(){
    this.price = 15;
    this.time = 10;
}

var a = new Steak();
var b = new FriedRice();
var c = new Noodles();

//歸類 開了個飯店a賣牛排 又開了個飯店b 賣炒飯
//開一家就可以了

上面的代碼就相當於我們開飯店,我們開了一家賣牛排的店,又開了一家賣炒飯的店,然後又開了一家賣麵條的店,雖然我們比較有錢,但是其實開一家店賣這幾樣東西就可以了

所以我們歸類,看下麵的代碼就是簡單工廠模式

 1 function Shop(name){
 2     var o = null;
 3     switch(name){
 4         case 'Steak' :
 5             o = new Steak();
 6             break;
 7         case 'FriedRice' : 
 8             o = new FriedRice();
 9             break;
10         case 'Noodles' : 
11             o = new Noodles();
12             break;
13     }
14     return o;
15 }
16 
17 new Shop('Noodles');
18 //好處 比如手機裡面有很多軟體 軟體歸類 好找 不用記什麼是什麼了
19 
20 //缺點 這個拓展有點不好

至於說缺點拓展性不好的理由呢就是,比如我們又要開一家烤鴨店的話,我們不僅要定義一個烤鴨的構造函數,而且還要在工廠中增加一個判斷,這個我就不寫了,下麵看看工廠模式就解決了這個問題

 

工廠模式

  

 1     function Shop(name) {
 2         console.log(this);
 3         return new this[name]();
 4     }
 5 
 6  
 7     Shop.prototype = {
 8         Steak : function () {
 9             this.price = 30;
10             this.time = 20;
11         },
12         FriedRice : function () {
13             this.price = 30;
14             this.time = 20;
15         },
16         Noodles : function () {
17             this.price = 30;
18             this.time = 20;
19         }
20     };
21 
22     var obj = new Shop('FriedRice');
23 
24     console.log(obj);

上面的如果在拓展的話直接在原型上拓展就可以了,非常方便。也非常好用。

 

原型模式

  原型模式是為瞭解決....

  好了先不說解決什麼,我們來幾個需求

  比如說我們需要寫一個輪播圖,我們就開始寫了,樣式就不寫了哈。

<div>
<ul>
<li><img src="" alt=""></li>
<li><img src="" alt=""></li>
<li><img src="" alt=""></li>
<li><img src="" alt=""></li>
</ul>
</div>
 1     var oUl = document.getElementsByTagName('ul')[0];
 2         aLi = document.getElementsByTagName('li');
 3 
 4     var index = 0,
 5         len = aLi.length;
 6 
 7     function Fn() {
 8         oUl.style.left = 600*index;
 9         index %= len;
10         index++;
11     }
12 
13     setInterval(Fn,1000);

  應該是可以實現的吧,沒有實驗,如果有錯誤指正一下。有問題又來了,如果又有一個新的輪播圖需要在輪播圖上面添加上兩個前進後退按鈕,那麼你會怎麼做,你可能會想反正代碼也不多我直接拿過來複制,在添加幾行代碼不就完了嗎,是這樣的沒錯,可是你想想如果有好多的輪播特效,你是不是每一種特效都需要複製一下上面的代碼呢,他們都是重覆的,所以我們可以用原型模式把上面的代碼來繼承下來。

  

 1     var oUl = document.getElementsByTagName('ul')[0],
 2         aLi = document.getElementsByTagName('li'),
 3         div = document.querySelector('div');
 4 
 5     var index = 0;
 6 
 7     //基本滾動
 8     function Banner(div){
 9         this.dom = div;
10         this.init();
11     }
12     //原型
13     Banner.prototype.init = function(){
14         var oUl = this.dom.getElementsByTagName('ul')[0];
15         var aLi = oUl.getElementsByTagName('li'),
16             len = aLi.length;
17         setInterval(function () {
18             oUl.style.left = 600*index;
19             index %= len;
20             index++;
21         },1000)
22     };
23 
24     // 那麼這個時候只需要繼承過來 然後再這基礎之上進行擴展 簡單點就是原型繼承
25     function F() {}
26     F.prototype = Banner.prototype;
27 
28     function Banner2(dom) {
29         Banner.call(this,dom);
30         this.goudan();
31     }
32     Banner2.prototype = new F();
33     Banner2.prototype.Slide = function () {
34         console.log('滾動');
35     };
36 
37     new Banner2(div);

代碼可能不是那麼嚴謹,這裡你知道大概的目的是什麼就可以了,你還可以在他的原型上面拓展出來好多其他特效,當然這種模式不僅僅應用於輪播圖特效,是為了代碼的復用問題。

  

建造者模式

  比如我們在工作需求中,需求經常發生變動,有時候一些變化可能會引起許多代碼的修改,這時我們的解決方案出來了,可以把一個對象分步驟建造出來,實現的功能分步驟單例出來。看一下下麵的小例子

  發佈簡歷

  

 1     //簡歷 : 人,姓名,職位
 2     var Human = function(param){
 3         //技能
 4         this.name = param || '保密';
 5     };
 6     Human.prototype.getname = function(){
 7         return this.name;
 8     };
 9     var Work = function(work){
10         switch(work){
11             case 'code':
12                 this.work = '工程師';
13                 this.workDescript = '每天沉迷於編程';
14                 break;
15             case 'UI':
16                 this.work = '設計師';
17                 this.workDescript = '設計是一種態度';
18                 break;
19             case 'teach':
20                 this.work = '教師';
21                 this.workDescript = '分享也是一種態度';
22                 break;
23             default:
24                 this.work = work;
25                 this.workDescript = '對不起我們還不清楚你的職位描述';
26         }
27     };
28 
29     //最終創建的對象
30     var Person = function(skill,work){
31         var _Person = new Human(skill);
32         _Person.work = new Work(work);
33         return _Person;
34     };
35     //這樣就可以
36     Person('xiaoz',teach);

  前面幾種工廠模式,他們都有一個共同的特點,就是創建的結果都是一個完整的個體,對創建的過程不得而知,我們只知道得到的創建結果,而在建造者模式當中,我們關心的是對象的創建過程,因為我們通常將創建對象的類模塊化,這樣使被創建的類的每一個模塊都可以得到靈活的額運用與高質量的復用,在這個過程中我們又組合成一個完整的個體。

  這種方式對於整體對象又變得複雜了一些,所以如果對象很小,我們最好還是創建整體對象。

 

  如果你閱讀了本文章有了一些收穫,我會感到非常開心,由於能力有限,文章有的部分解釋的不到位,希望在以後的日子里能慢慢提高自己能力,如果不足之處,還望指正。

在接下來的時間,我還會把其他的一些常用的設計模式分享給大家,希望可以支持一下。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原型設計大師:Axure RP網站與APP設計從入門到精通內容豐富且實用,由淺入深地傳授了Axure 原型設計工具在網站和APP設計中的應用與技巧,併在文中貫穿了眾多精彩實戰案例。書中完整展現了多個鮮活生動的綜合項目案例,涉及門戶網站高保真原型設計、電商網站高保真原型設計、移動APP 應用高保真原型 ...
  • 我個人建議: 如果你條件還可以,負擔不是那麼大,能培訓還是培訓的,培訓一定會比你自學的好,如果培訓都很難學好,那麼自學一定學不好。不過目前的培訓費用都在18000以上,這還只是培訓費而已,加上一些其他的東西,四個月時間要小三萬吧! 如果條件不允許,也可以選擇自學,自學挺難的,但是如果你韌性強,自學也 ...
  • 第二節課也聽到一半了,建好了另外的兩張表requst和relation,用圖展示一下它們之間的關係吧。 還是用sequelize生成的,貼一下代碼。 request是加好友請求用到的,兩個belongTo,是為了表示是誰加的誰,這兩個用戶之間的關係。 relation是表示好友關係,多對多的關係,所 ...
  • 1、什麼是HTML文件?HTML中文叫做“超文本標記語言”,一個HTML文件不僅包含文本內容,還包含一些標記,一個HTML文件的尾碼名是.htm或者是.html。用文本編輯器(Dreamweaver)就可以編寫HTML文件。2、html文件的基本結構:(成對出現)<html> html文件開始 <h ...
  • 最近公司做的業務都是使用Vue、Element寫的,涉及到的相應的基礎業務像輪播、預載入、懶載入,都是使用 NPM上的工具來實現,原理和基礎還是要有的,就來實現幾個項目中常用到的業務。 經常見到這樣的效果,導航在頁面中間,當界面滾動到導航的時候,導航就變成了 佈局。為了看效果,我加了邊框。 剛開始, ...
  •   這是第一次寫博客玩,也是第一次使用markdown寫東西(一邊看著語法一邊寫的來著),不過進步還是有滴~   申請博客以後,趕緊去翻了一下wjj童鞋的博客,發現他的封面是這樣的:   嗯……不得不說,這個網站的確是有一丟丟醜。不過怎麼能 ...
  • Ajax 即“Asynchronous Javascript And XML”(非同步 JavaScript 和 XML),是指一種創建交互網頁應用的網頁開發技術。 一. Ajax ajax技術的目的是讓javascript發送http請求,與後臺通信,獲取數據和信息。ajax技術的原理是實例化xml ...
  • 常用Grid佈局屬性介紹 下麵從一個簡單Grid佈局例子說起。 CSS Grid 佈局由兩個核心組成部分是 wrapper(父元素)和 items(子元素)。 wrapper 是實際的 grid(網格),items 是 grid(網格) 內的內容。 下麵是一個 wrapper 元素,內部包含6個 i ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...