设计模式的梗概

什么是设计模式

一般来说,创建不同类型的对象的套路称之为设计模式(Pattern Design)

常见的设计模式包括:

  • 单例模式:产生一个类的唯一实例
  • 工厂模式:批量生产出相似属性和方法的对象
  • 构造函数模式:可以理解为工厂模式的另一个写法
  • 混合模式:基于父类的构造函数的继承去创建对象
  • 模块模式:以模块化的思想去创建对象,提高代码复用性;
  • 发布订阅模式:定义对象间的一种一对多的关系

上面这几种基本的设计模式并不是孤立存在的,可以结合一起使用。

1.单例模式

  • 什么是单例模式
    单例模式的定义是产生一个类的唯一实例

  • 为什么需要采用单例模式
    它能够确保您只有一个对象实例能够实际派上用场

  • 单例模式演示

极简方式

优点:明白晓畅、简单快捷
缺点:缺乏封装,成员暴露,初始化时占用资源

var singleton = {
    attr:1,
    method:function(){
      return this.attr
    }
}
var ex1 = singleton;
var ex2 = singleton;

闭包方式

优点:解决成员暴露和初始化占用资源问题

var Substance = (function(){
  var unique;
  function init(){
    var type;
    return {
      setType: function(t){
        console.log(type = t)
      }
    }
  }
  
  return {
    getInstance:function(){
      if(!unique){
        unique = init();
      }
        return unique
     
    }
  }
})()
var Adam = Substance.getInstance();
var Eve = Substance.getInstance();
Adam.setType('Man')//Man
  • 实战-单例模式
    经常出现这么个需求,点击按钮网页出现一个遮罩层,然后弹出一个登陆框。这个遮罩层是全局唯一的,只需要用到一次,此时可以考虑使用单例模式。

【mask】

2.工厂模式

  • 什么是工厂模式
    工厂模式的设计思想就是能够像工厂一样批量生产出相似属性和方法的对象

  • 为什么使用工厂模式
    能解决多个相似的问题,例如创造多个弹窗(只是标题不同);

  • 工厂模式演示

function Animals (opts){
  var animals = {
    name:opts.name,
    type:opts.type
  };
  animals.sayName = function(){
    console.log(this.name)
  } 
  return animals
}
var tony = Animals({name:'tony',type:'dog'})
console.log(tony.type)
tony.sayName()
var sina = Animals({name:'sina',type:'cat'})
console.log(sina.type)
sina.sayName()
  • 实战-工厂模式
    经常出现这么个需求,单击按钮网页出现一个dialog,双击出现另一个dialog,两个dialog同属一个类创造出来的实例,同样拥有标题和内容属性

【dialog】

3.构造函数模式

  • 什么是构造函数模式
    利用构造函数的方式去创建对象的思维方法,这是js创建对象的基本方法;

  • 为什么需要使用构造函数模式
    简单易懂,符合逻辑;
    但形式有些丑陋,而且需要清楚了解this、new和原型等相关知识;

  • 构造函数模式演示

function Person(name,age){
  this.name = name;
  this.age = age
}
Person.prototype.sayName = function(){
  console.log(this.name)
}
var Kobe = new Person('Kobe','36');
var James = new Person('James','30');
Kobe.sayName()
James.sayName()
  • 实战-构造函数模式
    构造函数模式和工厂模式的功能类似,只是生产过程有些差异

【dialog】

4.混合模式

  • 什么是混合模式
    混合模式是基于构造函数的继承去创建对象的方式

  • 为什么要使用混合模式
    你要创建的对象既要有一级大类的共性,又要有二级小类的特性

  • 混合模式演示

function Animals(race,activity){
  this.race = race;
  this.activity = activity;
};
Animals.prototype.getActivity = function(){
  console.log(this.activity)
};

var Dog = function(race,activity){
  Animals.call(this,race,activity);
  this.voice = 'wow...'
};
Dog.prototype = Object.create(Animals.prototype);
Dog.prototype.constructor = Dog;
Dog.prototype.spark = function(){
  console.log(this.voice);
};
var Cat = function(race,activity){
  Animals.call(this,race,activity);
  this.voice = 'miao...'
};
Cat.prototype = Object.create(Animals.prototype);
Cat.prototype.constructor = Dog;
Cat.prototype.spark = function(){
  console.log(this.voice);
};
var tony = new Dog('dog','run');
console.log(tony.race);
console.log(tony.activity);
console.log(tony.voice);
tony.getActivity();
tony.spark();

var wiky = new Cat('cat','sleep')
wiky.getActivity();
wiky.spark();

【混合模式】

5.模块模式

  • 什么是模块模式
    以模块化的方式去创建对象,该方法可以封装私有变量,只暴露公共方法

  • 为什么使用模块模式
    提高代码的复用性

  • 模块化模式演示

var Calculator = (function(){
  //闭包隐藏私有变量
  var PI = 3.14
  function circle(r){
    return PI*r*r
  } 
  return {
    //暴露接口以供调用
      circle:circle
  }  
})();
console.dir(Calculator.circle(3))//28.259999999999998
console.dir(PI)//ReferenceError: PI is not defined

【模块化模式】

6.发布订阅模式

  • 什么是发布订阅模式
    发布—订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知

  • 为什么需要发布订阅模式
    支持简单的广播通信,当对象状态发生改变时,会自动通知已经订阅过的对象;

  • 发布订阅模式演示

var EventManger = (function(){
  var event = {}; 
  function on(eventName,callback){
    event[eventName] = event[eventName] || [];
    event[eventName].push({
      callback:callback,
    })
    return this
  };  
  function fire(eventName,data){
    if(!event[eventName]){return}
    var subscribers = event[eventName];
    var len = subscribers.length;
    while(len--){
      subscribers[len].callback(data)
    }
    return this;
   
  };
  
  function off(eventName){
    if(!event[eventName]){return}
    event[eventName].splice(0,1);
   return this
  
  }
  return {
    on:on,
    fire:fire,
    off:off
  }
})();

EventManger.on('text:change',function(val){
  console.log('text:change...now val is '+val);
});

EventManger.fire('text:change','hungerVallery');

EventManger.fire('text:change','stay hungry');

EventManger.off('text:change');

EventManger.fire('text:change','stay foolish');

【发布订阅模式】

    原文作者:犯迷糊的小羊
    原文地址: https://www.jianshu.com/p/edf6271444d0
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞