我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧!

上一次已经给大家介绍了简单工厂模式,相信大家对创建型设计模式有了初步的了解,本次我将给大家介绍的是工厂方法模式。

工厂方法模式

工厂方法模式(Factory Method):通过对产品类的抽象使其创建业务主要负责用于创建多类产品的实例。

这样说起来可能还是有很多人不理解,那么我们开始用示例来演示工厂方法模式吧

假如我们需要做一个商城的项目商城的项目里有很多板块,比如蔬果区,生鲜区,日用百货区,等等一些,他们可能所在的区域在页面中主色调完全不一样,按照我们之前分享的简单工厂模式的做法,我们也许会这样做。

创建一个蔬果区

var Vegetable=function(content){
this.content=content;
//创建闭包对象,直接执行,将内容样式直接插入页面
(function(content){
var vegetable=document.createElement('div');
vegetable.innerHTML=content;
vegetable.style.color='green';
//我们页面会定义个id名为container的区域放置这些模块
document.getElementById('container').appendChild(vegetable);
})(content)
}

接着我们创建一个生鲜区

var Fresh=function(content){
this.content=content;
//创建闭包对象,直接执行,将内容样式直接插入页面
(function(content){
var fresh=document.createElement('div');
fresh.innerHTML=content;
fresh.style.color='blue';
//我们页面会定义个id名为container的区域放置这些模块
document.getElementById('container').appendChild(fresh);
})(content)
}

最后我们再创建一个日用百货区

var DailyProvisions=function(content){
this.content=content;
//创建闭包对象,直接执行,将内容样式直接插入页面
(function(content){
var dailyProvisions=document.createElement('div');
dailyProvisions.innerHTML=content;
dailyProvisions.style.color='gray';
//我们页面会定义个id名为container的区域放置这些模块
document.getElementById('container').appendChild(dailyProvisions);
})(content)
}

现在我们创建一个商城类工厂

var mallFactory=function (name,text){
switch(name){
case 'Vegetable':
return new Vegetable(text);
case 'Fresh':
return new Fresh(text);
case 'DailyProvisions':
return new DailyProvisions(text);
}
}

最后我们测试一下

var vegetableTest=mallFactory("Vegetable","蔬果区");
var vegetableTest=mallFactory("Fresh","生鲜区");
var vegetableTest=mallFactory("DailyProvisions","日用百货区");

我们看到在页面上显示成功

但是这个时候如果我们想要在加一个家电区,要用不同的颜色代替,我们会发现,我们不仅要新建一个家电类,还要在商城的工厂里添加对应的类型,会很麻烦,那么这个时候我们就可以用工厂方法模式。

首先我们来创建一个工厂类

var Factory=function(type,content){
if(this instanceof Factory){
var o=new this[type](content);
return o;
}else{
return new Factory(type,content);
}
}

接着我们把我们需要创建的所有类型的父类添加到我们的工厂里去

Factory.prototype={
Vegetable:function(content){
this.content=content;
//创建闭包对象,直接执行,将内容样式直接插入页面
(function(content){
var vegetable=document.createElement('div');
vegetable.innerHTML=content;
vegetable.style.color='green';
//我们页面会定义个id名为container的区域放置这些模块
document.getElementById('container').appendChild(vegetable);
})(content)
},
Fresh:function(content){
this.content=content;
//创建闭包对象,直接执行,将内容样式直接插入页面
(function(content){
var fresh=document.createElement('div');
fresh.innerHTML=content;
fresh.style.color='blue';
//我们页面会定义个id名为container的区域放置这些模块
document.getElementById('container').appendChild(fresh);
})(content)
},
DailyProvisions:function(content){
this.content=content;
//创建闭包对象,直接执行,将内容样式直接插入页面
(function(content){
var dailyProvisions=document.createElement('div');
dailyProvisions.innerHTML=content;
dailyProvisions.style.color='gray';
//我们页面会定义个id名为container的区域放置这些模块
document.getElementById('container').appendChild(dailyProvisions);
})(content)
}
}

这样我们就建立了一个工厂方法,现在我们要在想添加一个父类就可以直接添加在工厂里了,是不是方便很多,下面我们试着调用一下。

var data=[
{name:'Vegetable',text:'蔬果区'},
{name:'Fresh',text:'生鲜区'},
{name:'DailyProvisions',text:'日用百货区'}
]
for(var i=0;i<data.length;i++){
Factory(data[i].name,data[i].text);
}



我们再来看一下结果,得到的结果都是一样的,但是如果还需要添加基类,就只用想我们的工厂方法里添加一次就够了。

也谢谢大家看到这里:)如果你觉得我的分享还可以请点击推荐,分享给你的朋友让我们一起进步~

好了以上就是本次分享的全部内容,本次示例参考自JavaScript设计模式一书,让我们一点点积累一点点成长,希望对大家有所帮助。

欢迎转载,转载请注明作者,原文出处。

再起航,我的学习笔记之JavaScript设计模式06(工厂方法模式)的更多相关文章

  1. 再起航,我的学习笔记之JavaScript设计模式05(简单工程模式)

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前几 ...

  2. 再起航,我的学习笔记之JavaScript设计模式06(抽象工厂模式)

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前两 ...

  3. 再起航,我的学习笔记之JavaScript设计模式30(简单模板模式)

    简单模板模式 概念介绍 简单模板模式(Simple template): 通过格式化字符串拼凑出视图避免创建视图时大量节点操作,优化内存开销. 创建模板 在实际的业务中如果我们需要进行前后台交互,或多 ...

  4. 再起航,我的学习笔记之JavaScript设计模式13(装饰者模式)

    装饰者模式 装饰者模式(Decorator): 在不改变原对象的基础上,通过对其进行过包装拓展(添加属性高或者方法)使原有对象可以满足用户的更复杂需求. 如果现在我们有个需求,需要做一个提交表单,当我 ...

  5. 再起航,我的学习笔记之JavaScript设计模式23(中介者模式)

    中介者模式 概念介绍 中介者模式(Mediator):通过中介者对象封装一系列对象之间的交互,使对象之间不再相互引用降低他们之间的耦合,有时中介者对象也可以改变对象之间的交互. 创建一个中介 中介者模 ...

  6. 再起航,我的学习笔记之JavaScript设计模式16(享元模式)

    ### 享元模式 **享元模式(Flyweight):** 运用共享技术有效地支持大量的细粒度的对象,避免对象间拥有相同内容造成多余的开销. 上回我们在组合模式中创建了文章列表类,这次我们要向不同的文 ...

  7. 设计模式C++学习笔记之五(Factory Method工厂方法模式)

      工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的 ...

  8. 再起航,我的学习笔记之JavaScript设计模式05(简单工厂模式)

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前几 ...

  9. 再起航,我的学习笔记之JavaScript设计模式07(抽象工厂模式)

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前两 ...

随机推荐

  1. 15套java架构师、集群、高可用、高可扩 展、高性能、高并发、性能优化Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战视频教程

    * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩 展 ...

  2. 【Android Developers Training】 60. 在你的UI中显示位图

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  3. JS常用方法(获取Class、获取元素样式、事件监听、cookie、ajax等)

    var Util = {}; Util.byClass = function (oClass) {//全局获取 var tags = document.all ? document.all : doc ...

  4. chart.js使用常见问题

    Chart.js是一个简单.面向对象.为设计者和开发者准备的图表绘制工具库. 在使用过程中新手可能会遇到很多问题导致图标无法显示.下面我们来看一下在使用过程中可能会遇到的问题. 刚开始用chart.j ...

  5. ASP.NET MVC5+EF6+EasyUI 后台管理系统(85)-Quartz 作业调度用法详解二

    前言 上一节我们学习了Quartz的基本用法 这一节学习通过XML配置的形式来执行任务 这一节主要认识一些属性,为下一步打基础 代码下载:链接:http://pan.baidu.com/s/1ge6j ...

  6. 安装 Node 和 gulp

    gulp 是基于 node 实现的,那么我们就需要先安装 node. Node 是一个基于Chrome JavaScript V8引擎建立的一个平台,可以利用它实现 Web服务,做类似PHP的事. 打 ...

  7. FZU 1015 土地划分

        Description 在Dukeswood这块土地上生活着一个富有的农庄主和他的几个孩子.在他临终时,他想把他的土地分给他的孩子.他有许多农场,每个农场都是一块矩形土地.他在农场地图上划上一 ...

  8. HDU 1051 Wooden Sticks 贪心||DP

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  9. Arcgis Engine axMapControl1.get_layer(index)中index意义

    像 ILayer pLayer = this.axMapControl1.get_Layer(0); 意思是获取axMapControl1中的第一个图层,复制给pLayer.

  10. jmeter-Java关于MD5加密方法 以及16位32位互转

    MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已有MD5实现.将 ...