JavaScript 23 種設計模式之 11 享元模式

JavaScript 23 種設計模式之 11 享元模式

概念與特點

概念:
享元模式是一種性能優化方案,其核心是利用共享技術有效支持大量類似的顆粒度對象,從而儘可能減少對象的創建,節省內存空間。

特點:

  1. 相同對象只需要保存一份,減少對象的數量。
  2. 爲了使對象能夠共享,需要將一些不能共享的狀態外部化,從而增加系統複雜度。

結構與實現

享元模式包含抽象享元類,具體享元類,非享元類,享元工廠類。
抽象享元類:定義抽象方法,外部狀態通過參數傳入。
具體享元類:實現抽象享元中的方法。
非享元類:不可以共享的外部狀態,以參數的形式傳入到具體享元的方法中。
享元工廠類:複雜創建和管理享元角色。

小劇場:
比如工廠有 50 種男內衣和 50 種女內衣,如果不用享元模式,可能分別需要 50 個男模特和 50 個女模特。即需要創建 100 個對象。

var Model = function( sex, underwear){
    this.sex = sex;
    this.underwear= underwear;
};
Model.prototype.takePhoto = function(){
    console.log( 'sex= ' + this.sex + ' underwear=' + this.underwear);
};
for ( var i = 1; i <= 50; i++ ){
    var maleModel = new Model( 'male', 'underwear' + i );
    maleModel.takePhoto();
};
for ( var j = 1; j <= 50; j++ ){
    var femaleModel= new Model( 'female', 'underwear' + j );
    femaleModel.takePhoto();
};

如果使用享元模式則只需要創建兩個對象即可。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8"/>
    <title>React App</title>
</head>
<body>
<script>
   //抽象享元角色-模特
   class Modal{
       //傳入外部狀態-拍照
       takePhoto(underwear){

       }
   }
   //具體享元角色
   class GenderModal extends Modal{
       constructor(gender){
           super();
           this.gender = gender;
           console.log("具體享元"+gender+"被創建")
       }
       takePhoto(underwear){
           console.log( 'gender= ' + this.gender + ' underwear=' + underwear.getState());
       }
   }
   //非享元角色-不能共享的外部狀態
   class OutState{
       constructor(state){
           this.state = state;
       }
       getState(){
           return this.state;
       }
   }
   //享元工廠角色-創建和管理享元角色
   class Factory{
       constructor(){
           this.resource = new Map();
       }
       getModal(key) {
           var fly = this.resource.get(key);
           if(fly!=null){
               console.log("具體享元"+key+"已經存在")
           }else {
               fly = new GenderModal(key);
               this.resource.set(key,fly);
           }
           return fly;
      }
   }

    class Customer{
      static  main(){
          let factory = new Factory();
          let maleModal  = factory.getModal("male");
          let femaleModal = factory.getModal("female");
          for(let i = 0;i<50;i++){
              maleModal.takePhoto(new OutState(i));
              femaleModal.takePhoto(new OutState(i));
          }
        }
    }
    Customer.main();
</script>
</body>
</html>

應用場景

  1. 系統中存在相同或相似的對象,並且耗費大量的內存資源。
  2. 大部分的對象可以按照內部狀態進行分組。
  3. 有足夠多的享元實例才值得使用享元模式。

應用實例

暫無。

總結

享元模式就是將相同的對象進行儲存(儲存之前先創建,然後下次直接獲取),將相似的對象進行封裝。然後通過參數傳入外部狀態,完成一系列的功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章