JavaScript 创建型设计模式


总结#

创建型设计模式是一类处理对象创建的设计模式,通过某种方式控制对象的创建来避免基本对象创建时可能导致设计上的问题或者增加设计的复杂度。

如果需要创建一类对象,可以使用简单工厂模式。
如果需要创建多类对象,可以使用工厂方法模式。
如果需要制定类的结构,可以使用抽象工厂模式。
如果需要精确的控制创造对象时的每一个细节,并且创造的对象结构更加复杂,是个复合对象,可以使用建造者模式。
如果需要使用静态变量,规划命名空间,可以使用单例模式。


简单工厂模式(Simple Factory)##

  • 主要用来创建同一类对象(单一对象)
  • 对于同一类对象在不同需求中的重复性使用,很多时候不需要重复创建。通过简单工厂来创建一些对象,可以让这些对象共用一些资源而又私有一些资源。
  • 具体实现:
    1.通过类实例化对象创建。
 function A(){};
 function B(){};
 function C(){};
var ABC = function(value){
    switch(value){
      case'A':return new A();
      case'B':return new B();
      case'C':return new C();
    }
}
var object = ABC('A');

2.通过(寄生方式)创建一个新对象然后包装增强其属性和功能来实现。

function createObject(name,type){
  var o = new Object();
  o.name = name;
o.type = type;
o.consoleName = function(){
console.log(this.name);
}
return o;
}
var object = createObject('moonburn','coll');

两种方式的差异性体现在,通过第一种方式创建的对象,因为继承与同一个父类,所以他们父类的方法是可以共用的;而通过第二种寄生方式创建的对象,每一个都是新的个体,所以他们的方法是不能共用的。


工厂方法模式(Factory Method)##

  • 主要用来创建多个对象。
  • 通过对产品类的抽象使其创建业务主要负责用于创建多类产品的实例。
    工厂方法的本意是将实际创建对象工作推迟到了之类中,把核心类作为抽象类。因为JavaScript没有传统意义上的抽象类概念,所以我们只需将工厂方法看成一个实例化对象的工厂类(安全起见,我们采用安全模式类),而我们创建的对象的基类放在工厂方法类的原型即可
  • 具体实现:
var Factory = function(name,type){
//安全模式
if(this instanceof Factory){
  var a = new this[name](type);
return a;
}else{
return new Factory(name,type);
}
}
Factory.prototype = {
moonburn:function(type){},
moon:function(type){},
burn:function(type){}
}
var moonburn = Factory('moonburn','coll');

抽象工厂模式(Abstract Factory)##

  • 通过对类的工厂抽象使其业务用于对产品类簇的创建,而不负责创建某一类产品的实例。
  • 一般把它作为父类,创建一些子类。抽象工厂模式是设计模式中最抽象的一种,也是创建模式中唯一一种抽象化创建模式。该模式创建出的结果不是一个真实的对象实例。而是一个类簇,它制定了类的结构,这也是区别于简单工厂创建单一对象,工厂模式创建多类对象。
  • 抽象类具体实现:
var People = function (){};
People.prototype = {
getName:function (){return new Error('抽象方法不能调用')}
}
  • 抽象工厂模式实现
var People = function (subType,superType){
//判断抽象工厂内是否有该抽象类
if(typeof People(superType) === 'function'){
function F(){};
F.prototype = new People[superType]();
subType.constructor = subType;
subType.prototype = new F();
}else{
throw new Error('未创建该抽象类');
}
}
//定义Man抽象类
People.Man = function(){
this.type = 'man';
}
People.Man.prototype = {
getName:function(){return new Error('抽象方法不能调用')}
}
var Students = function(name){
this.name = name;
}
//抽象工厂实现对Man抽象类的继承
People(Student,'Man');
Students.prototype.getName = function (){return this.name};
//实例化
var moonburn = new Students('moonburn');
console.log(moonburn.getName());  //moonburn

建造者模式(Builder)##

  • 建造者模式更多的是关注对象建造的整个过程,甚至于说是建造的每一个细节。
  • 建造者模式下创建的对象更多的是复合对象,是结构更为复杂的对象。
  • 具体实现:
var People = function (type){
this.type = type||'保密';
}
People.prototype = {consoleType:function (){console.log(this.type)}}
var Name = function (name){
this.name = name;
}
var Work = function (work){
this.work = work;
}
var Person = function(name,work){
 var _person = new People();
_person.name = new Name(name);
_person.work = new Work(work);
return _person;
}
var moonburn  = new Person('moonburn','student');
console.log(moonburn.name.name); //moonburn
console.log(moonburn.work.work); //student
console.log(moonburn.type); //保密

原型模式(Prototype)##

  • 用原型实例指向创建对象的类,使用于创建新的对象的类的共享原型对象的属性已经方法。
  • 我们平时用的原型继承就是参照于原型模式。
  • 原型模式有一个特点就是在任何时候都可以对基类或者子类进行方法的拓展,而且所有被实例化的对象或者类都能获取到这些方法,这样给予我们对功能拓展的自由性(正由于这种方式太过自由,所以不要随意去做,否则如果修改类的其他属性或者方法很可能会影响到其他人)。

单例模式(Singleton)##

  • 单例模式又称为单体模式,是只允许实例化一次的对象类。有时我们也用一个对象来规划一个命名空间,更加方便的管理对象上的属性和方法。
  • JavaScript中的单例模式除了定义命名空间,还有一个作用,就是通过单例模式来管理代码库的各个模块。比如早起的百度,雅虎,都是通过单例模式来控制自己每一个功能模块的。
  • 单例模式可以模拟静态变量,具体如下:
var Conf = (function (){
var conf = { COUNT:100//静态变量约定为大写 }
return {  get:function (value){  return conf[name]?conf[name]:'没有此静态变量'  }  }
})();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,729评论 2 17
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,058评论 1 10
  • 面向对象编程 1.创建,使用函数 var CheckObject = {checkName : function(...
    依米花1993阅读 386评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,638评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,603评论 18 399