我们大家一听到设计模式就感觉设计模式是一个高端的东西,到底什么是设计模式呢?其实设计模式也就是我们的前辈在写代码的时候遇到的问题,提出的解决方案,为了方便人与人之间的交流,取了个名字,叫做设计模式。

创建型设计模式

  本文今天主要写一部分创建型设计模式,创建型设计模式呢就是我门创建对象的时候的一种模式。废话不多说了,直接上代码和解释吧。

单例模式

  目的:单例模式的目的是为了解决全局命名空间污染,冲突。

  

 function g(id) {
return document.getElementById(id);
} function css(id,key,value) {
g(id).style[key] = value;
} function html(id,value) {
g(id).innerHTML = value;
} function on(id,type,fn) {
g(id)['on'+type] = fn;
}

  上面的代码在页面中添加了许多的变量,日后其他的人要为页面添加新的需求时,增加代码或者是重写了代码,比如这个on方法,那么就会和其他人的代码冲突,所以可以用单例模式来书写一下代码。

  代码样式如下

 //工程师 z
var xiaoz = {
g : function (id) {
return document.getElementById(id);
},
css : function (id,key,value) {
g(id).style[key] = value;
}
};
//工程师 y
var xiaoy = {
css : function () {
//一堆代码
}
};

这样几个人之间的代码就不会相互影响了,上面的代码调用的方式如下。

xiaoz.g('box');

  在单例模式中还有另外一种,关于静态变量在es6才提出来的const,静态变量是一旦确定就无法修改的量,但是现在es6的兼容性还不是太好,在单例模式中同样可以模拟这种可以定义但是无法改变的变量。

  

 var xiao = (function(){
var bian = {
a : 1,
b : 2,
fn : function(){
console.log('这里是fn')
}
};
return {
getdata:function(val){
return bian[val];
}
}
})();
//里面的变量只能获取 不能修改

简单工厂模式

  简单工厂模式不是解决命名空间问题的,是为了解决创建对象的。

  看下面的代码例子

  

//牛排
function Steak(){
this.price = 30;
this.time = 20;
}
//炒饭
function FriedRice(){
this.price = 10;
this.time = 5;
}
//面条
function Noodles(){
this.price = 15;
this.time = 10;
} var a = new Steak();
var b = new FriedRice();
var c = new Noodles(); //归类 开了个饭店a卖牛排 又开了个饭店b 卖炒饭
//开一家就可以了

上面的代码就相当于我们开饭店,我们开了一家卖牛排的店,又开了一家卖炒饭的店,然后又开了一家卖面条的店,虽然我们比较有钱,但是其实开一家店卖这几样东西就可以了

所以我们归类,看下面的代码就是简单工厂模式

 function Shop(name){
var o = null;
switch(name){
case 'Steak' :
o = new Steak();
break;
case 'FriedRice' :
o = new FriedRice();
break;
case 'Noodles' :
o = new Noodles();
break;
}
return o;
} new Shop('Noodles');
//好处 比如手机里面有很多软件 软件归类 好找 不用记什么是什么了 //缺点 这个拓展有点不好

至于说缺点拓展性不好的理由呢就是,比如我们又要开一家烤鸭店的话,我们不仅要定义一个烤鸭的构造函数,而且还要在工厂中增加一个判断,这个我就不写了,下面看看工厂模式就解决了这个问题

工厂模式

  

     function Shop(name) {
console.log(this);
return new this[name]();
} 6  
Shop.prototype = {
Steak : function () {
this.price = 30;
this.time = 20;
},
FriedRice : function () {
this.price = 30;
this.time = 20;
},
Noodles : function () {
this.price = 30;
this.time = 20;
}
}; var obj = new Shop('FriedRice'); console.log(obj);

上面的如果在拓展的话直接在原型上拓展就可以了,非常方便。也非常好用。

原型模式

  原型模式是为了解决....

  好了先不说解决什么,我们来几个需求

  比如说我们需要写一个轮播图,我们就开始写了,样式就不写了哈。

<div>
<ul>
<li><img src="" alt=""></li>
<li><img src="" alt=""></li>
<li><img src="" alt=""></li>
<li><img src="" alt=""></li>
</ul>
</div>
     var oUl = document.getElementsByTagName('ul')[0];
aLi = document.getElementsByTagName('li'); var index = 0,
len = aLi.length; function Fn() {
oUl.style.left = 600*index;
index %= len;
index++;
} setInterval(Fn,1000);

  应该是可以实现的吧,没有实验,如果有错误指正一下。有问题又来了,如果又有一个新的轮播图需要在轮播图上面添加上两个前进后退按钮,那么你会怎么做,你可能会想反正代码也不多我直接拿过来复制,在添加几行代码不就完了吗,是这样的没错,可是你想想如果有好多的轮播特效,你是不是每一种特效都需要复制一下上面的代码呢,他们都是重复的,所以我们可以用原型模式把上面的代码来继承下来。

  

     var oUl = document.getElementsByTagName('ul')[0],
aLi = document.getElementsByTagName('li'),
div = document.querySelector('div'); var index = 0; //基本滚动
function Banner(div){
this.dom = div;
this.init();
}
//原型
Banner.prototype.init = function(){
var oUl = this.dom.getElementsByTagName('ul')[0];
var aLi = oUl.getElementsByTagName('li'),
len = aLi.length;
setInterval(function () {
oUl.style.left = 600*index;
index %= len;
index++;
},1000)
}; // 那么这个时候只需要继承过来 然后再这基础之上进行扩展 简单点就是原型继承
function F() {}
F.prototype = Banner.prototype; function Banner2(dom) {
Banner.call(this,dom);
this.goudan();
}
Banner2.prototype = new F();
Banner2.prototype.Slide = function () {
console.log('滚动');
}; new Banner2(div);

代码可能不是那么严谨,这里你知道大概的目的是什么就可以了,你还可以在他的原型上面拓展出来好多其他特效,当然这种模式不仅仅应用于轮播图特效,是为了代码的复用问题。

  

建造者模式

  比如我们在工作需求中,需求经常发生变动,有时候一些变化可能会引起许多代码的修改,这时我们的解决方案出来了,可以把一个对象分步骤建造出来,实现的功能分步骤单例出来。看一下下面的小例子

  发布简历

  

     //简历 : 人,姓名,职位
var Human = function(param){
//技能
this.name = param || '保密';
};
Human.prototype.getname = function(){
return this.name;
};
var Work = function(work){
switch(work){
case 'code':
this.work = '工程师';
this.workDescript = '每天沉迷于编程';
break;
case 'UI':
this.work = '设计师';
this.workDescript = '设计是一种态度';
break;
case 'teach':
this.work = '教师';
this.workDescript = '分享也是一种态度';
break;
default:
this.work = work;
this.workDescript = '对不起我们还不清楚你的职位描述';
}
}; //最终创建的对象
var Person = function(skill,work){
var _Person = new Human(skill);
_Person.work = new Work(work);
return _Person;
};
//这样就可以
Person('xiaoz',teach);

  前面几种工厂模式,他们都有一个共同的特点,就是创建的结果都是一个完整的个体,对创建的过程不得而知,我们只知道得到的创建结果,而在建造者模式当中,我们关心的是对象的创建过程,因为我们通常将创建对象的类模块化,这样使被创建的类的每一个模块都可以得到灵活的额运用与高质量的复用,在这个过程中我们又组合成一个完整的个体。

  这种方式对于整体对象又变得复杂了一些,所以如果对象很小,我们最好还是创建整体对象。

  如果你阅读了本文章有了一些收获,我会感到非常开心,由于能力有限,文章有的部分解释的不到位,希望在以后的日子里能慢慢提高自己能力,如果不足之处,还望指正。

在接下来的时间,我还会把其他的一些常用的设计模式分享给大家,希望可以支持一下。

javaScript设计模式-创建型设计模式的更多相关文章

  1. OOAD-设计模式(三)之创建型设计模式(5种)

    前言 前面介绍了OOAD的基础知识,现在我们来详细的说明一下GOF设计模式中的23种模式,希望大家能够学到东西! 一.工厂方法模式(Factory Method) 1.1.工厂方法模式概述 工厂方法模 ...

  2. [Python编程实战] 第一章 python的创建型设计模式1.1抽象工厂模式

    注:关乎对象的创建方式的设计模式就是“创建型设计模式”(creational design pattern) 1.1 抽象工厂模式 “抽象工厂模式”(Abstract Factory Pattern) ...

  3. php开发面试题---创建型设计模式1(创建型设计模式有哪几种)

    php开发面试题---创建型设计模式1(创建型设计模式有哪几种) 一.总结 一句话总结: 共五种:(简单工厂模式).工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 1.学设计模式最好的方 ...

  4. java设计模式--创建型模式(一)

    2016-04-24 10:10:34 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 注意:工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂 ...

  5. C# 设计模式·创建型模式

    面试问到这个··答不出来就是没有架构能力···这里学习一下···面试的时候直接让我说出26种设计模式··当时就懵逼了··我记得好像之前看的时候是23种的 还有3个是啥的··· 这里先列出几种创建型模式 ...

  6. 【python设计模式-创建型】工厂方法模式

    工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻 ...

  7. C#设计模式-创建型模式(转)

    一.简单工厂模式 简单工厂模式Simple Factory,又称静态工厂方法模式.它是类的创建模式.是由一个工厂对象决定创建出哪一种产品类的实例,是不同的工厂方法模式的一个特殊实现. 优点: u 模式 ...

  8. 原型模式 prototype 创建型 设计模式(七)

    原型模式  prototype 意图 用原型实例指定需要创建的对象的类型,然后使用复制这个原型对象的方法创建出更多同类型的对象   显然,原型模式就是给出一个对象,然后克隆一个或者更多个对象 小时候看 ...

  9. Python设计模式 - 创建型 - 单例模式(Singleton) - 十种

    对于很多开发人员来说,单例模式算是比较简单常用.也是最早接触的设计模式了,仔细研究起来单例模式似乎又不像看起来那么简单.我们知道单例模式适用于提供全局唯一访问点,频繁需要创建及销毁对象等场合,的确方便 ...

随机推荐

  1. Jquery ajaxfileupload.js结合.ashx文件实现无刷新上传

    先上几张图更直观展示一下要实现的功能,本功能主要通过Jquery ajaxfileupload.js插件结合ajaxUpFile.ashx一般应用程序处理文件实现Ajax无刷新上传功能,结合NPOI2 ...

  2. ASP.net里不让浏览器缓存代码和Session使用注意事项

    //不让浏览器缓存             context.Response.Buffer = true;             context.Response.ExpiresAbsolute = ...

  3. Android 开发环境搭建与Hello World

    Hello World 到这里, 环境搭建就没问题了. 接下来, 创建一个Android 的Hello World. 1.  添加一个安卓虚拟设备 直接点击虚拟设备管理图标或是  Window--&g ...

  4. Exynos4412从SD卡启动的简单网络文件系统制作

    Exynos4412从SD卡启动的简单网络文件系统制作 1. 简介 嵌入式系统能够在开发板上正常运行,需要先进行系统配置,一个完整的嵌入式系统应该包含的几个部分::uboot,kernel,rootf ...

  5. ThreadLocal原理

    ThreadLocal类可以看作是当前线程的一个局部变量,只有当前线程可以访问,因此是线程安全的. ThreadLocal内部维护了一个ThreadLocalMap类,ThreadLocalMap是一 ...

  6. Python Cookbook(第3版)中文版:15.17 传递文件名给C扩展

    15.17 传递文件名给C扩展¶ 问题¶ 你需要向C库函数传递文件名,但是需要确保文件名根据系统期望的文件名编码方式编码过. 解决方案¶ 写一个接受一个文件名为参数的扩展函数,如下这样: static ...

  7. $CDQ$分治总结

    A.\(CDQ\) 分治 特别基础的教程略. \(CDQ\)分治的优缺点: ( 1 )优点:代码量少,常数极小,可以降低处理维数. ( 2 )缺点:必须离线处理. \(CDQ\)分治与其他分治最本质的 ...

  8. LCT 模板及套路总结

    这一个月貌似已经考了无数次\(LCT\)了..... 保险起见还是来一发总结吧..... A. LCT 模板 \(LCT\) 是由大名鼎鼎的 \(Tarjan\) 老爷发明的. 主要是用来维护树上路径 ...

  9. Centos samba 服务配置

    1背景 转到Linux有段时间了,vim操作还不能应对工程代码,之前一直都是Gnome桌面 + Clion 作开发环境,无奈在服务器上没有这样的环境, 看同事是(Windows)Source Insi ...

  10. mybatis的Mapper文件配置

    一.resultMap resultMap 元素是 MyBatis 中最重要最强大的元素. 该配置节点下如下子节点配置 id – 一个 ID 结果;标记结果作为 ID 可以帮助提高整体效能 const ...