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. 有足够多的享元实例才值得使用享元模式。

应用实例

暂无。

总结

享元模式就是将相同的对象进行储存(储存之前先创建,然后下次直接获取),将相似的对象进行封装。然后通过参数传入外部状态,完成一系列的功能。

猜你喜欢

转载自blog.csdn.net/weixin_44135121/article/details/106017434
今日推荐