设计模式的梗概

什么是设计模式

一般来说,创建不同类型的对象的套路称之为设计模式(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');

【发布订阅模式】

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容