上节我们讲解了单例模式,这节我们将继续讲解工厂模式和迭代器模式

工厂模式:

工厂模式的目的是为了方便的创建对象(可以在不知道构造的情况下),通过静态方法来实现,在java或c#等静态编译语言中需要通过反射实现,而javascript这一切会很简单,利用索引访问方法特性,如Coffee[coffeeType]();

var Coffee = function (name,price) {
this.name = name;
this.price = price;
}
Coffee.createCoffee = function (coffeeType) {
if (typeof Coffee[coffeeType] != 'function') {
throw Error('没有此种类型咖啡');
}
return Coffee[coffeeType]();
}
Coffee.mocha = function () {
return new Coffee('MochaCoffee', 20);
}
Coffee.blue = function () {
return new Coffee('BlueCoffee', 30);
}
module.exports = Coffee;
var blueCoffee =   Coffee.createCoffee('blue');
console.log(blueCoffee.name === 'BlueCoffee');

通过静态方法创建各种类型coffee实现,然后在工厂方法(createCoffee)中通过索引调用相应的方法并返回对象,在代码编写过程中最重要的是将方法名和方法的实际含义关联起来,这样再创建时才可以正确快速的找到需要的类型。

装饰模式:

装饰模式是一种非常实用的模式,本质是一种对象的组合,手机话费构成是典型的装饰模式,话费一般由基础套餐(N个)和特色套餐(m个)构成,不做处理的情况下用户套餐可能需要n*m个对象才能描述,很显然没人会这样做,人们需要的是一个N+M的组合方式。

首先定义基础套餐类,基础套餐采用之前介绍的工厂模式创建,预置了几种套餐类型:

var BasePackage = function (price, description) {

    this.price = Number(price);
this.description = description; BasePackage.prototype.getDescription = function () {
return '您的套餐:' + this.description + '每月' + this.price;
}
} BasePackage.create = function (packageType) {
if (typeof BasePackage[packageType] != "function") {
throw Error('没有这样的套餐');
}
return BasePackage[packageType]();
} BasePackage.home = function () {
return new BasePackage('50', '基础套餐');
} BasePackage.business = function () {
return new BasePackage('100', '商务套餐');
} BasePackage.ultimate = function () {
return new BasePackage('150', '旗舰套餐');
}

接着创建特色套餐,同样采用工厂模式,也同样预置几种套餐类型

var FeaturePackage = function (price, description) {

    this.price = Number(price);
this.description = description;
} FeaturePackage.create = function (packageType) {
if (typeof FeaturePackage[packageType] != "function") {
throw Error('没有这样的套餐');
}
return FeaturePackage[packageType]();
} FeaturePackage.traffic = function () {
return new FeaturePackage('20', '流量套餐');
} FeaturePackage.sms = function () {
return new FeaturePackage('10', '短信套餐');
}

需要将特色套餐装饰到基础套餐类中从而实现各种套餐组合,在基础套餐类定义装饰方法:

BasePackage.prototype.decorate= function(decorate) {
var featurePackage = FeaturePackage.create(decorate);
this.price += featurePackage.price;
this.description += ' + ' + featurePackage.description;
}

最后在搭配套餐的时候只需要选择想要的基础套餐和特色套餐装饰起来即可:

var basePackage = BasePackage.create('home');
basePackage.decorate('sms');
console.log(basePackage.getDescription());

小结:

本节讲解了工厂和装饰模式,并将两种模式融合在一起组成了一个手机套餐实例,工厂模式可以代替new操作,而装饰模式可以将对象进行组合从而实现代码的复用。

javascript模式 (3)——工厂模式和装饰模式的更多相关文章

  1. JavaScript 三种工厂模式

    标签(空格分隔): JavaScript 简单工厂模式是工厂函数返回实例化对象或者对象,工厂函数作为一个方法. 工厂方法模式是工厂函数不作改变,将子类放在工厂原型中:工厂函数返回对应的实例化对象:re ...

  2. JavaScript面向对象OOM 2(JavaScript 创建对象的工厂模式和构造函数模式)

      在创建对象的时候,使用对象字面量和 new Object() 构造函数的方式创建一个对象是最简单最方便的方式.但是凡是处于初级阶段的事物都会不可避免的存在一个问题,没有普适性,意思就是说我要为世界 ...

  3. <JavaScript> 稳妥构造函数模式与工厂模式的区别

    稳妥构造函数模式的代码应该是这样的: function Person(name, age, job) { var o = new Object(); // private members var na ...

  4. Java中的GOF23(23中设计模式)--------- 工厂模式(Factory)

    Java中的GOF23(23中设计模式)--------- 工厂模式(Factory) 在给大家介绍工厂模式之前,我想和大家聊聊面向对象的那点事,在这里,引入三个概念. 开闭原则(Open Close ...

  5. Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式

    工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...

  6. Java中设计模式之工厂模式-4

    一.工厂模式由来 1)还没有工厂时代:假如还没有工业革命,如果一个客户要一款宝马车,一般的做法是客户去创建一款宝马车,然后拿来用. 2)简单工厂模式:后来出现工业革命.用户不用去创建宝马车.因为客户有 ...

  7. JS 简单工厂模式,工厂模式(二)

    一.什么是工厂模式: 工厂模式就是用来创建对象的一种最常用的设计模式,我们不暴露创建对象的具体逻辑,而是将逻辑封装到一个函数中,那么,这个函数 就可以被视为一个工厂.那么,在实际项目中,我们是不是可以 ...

  8. .Net简单工厂模式,工厂模式,抽象工厂模式实例

    1.定义   简单工厂模式:是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 工厂模式:定义一个用于创建对象的接口, ...

  9. C#设计模式——简单工厂模式、工厂模式和抽象工厂模式

    一:简单工厂模式 1:描述:简单工厂模式是由一个工厂对象根据接收到的消息决定要创建哪一个类的对象事例. 2:优点:工厂类中有相关逻辑判断,可以根据需要动态创建相关的对象事例,而客户端只需要告诉工厂类创 ...

随机推荐

  1. angularJS之事件处理

    angularJS的事件不像js一样,会默认有冒泡和捕获,还有angularJS之间的同名控制器之间,也只是同名, 不会让他们关联起来,就是这个名字的控制器的数据的改变不会影响到另一个同名的控制器. ...

  2. ScheduleThreadPoolExecutor的工作原理与使用示例

    欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. ScheduleExecutorService接口.ScheduledFuture ...

  3. C++中“类”相关知识点汇总

    一:类中默认的成员函数 一个空的class在C++编译器处理过后就不再为空,编译器会自动地为我们声明一些member function,如果你写 class Empty{}; 就相当于: class ...

  4. Open Cascade DataExchange DXF

    Open Cascade DataExchange DXF eryar@163.com 摘要Abstract:对DXF文本格式进行详细介绍,并介绍了如何使用开源库dxflib对DXF文件进行读写操作, ...

  5. 插入排序java代码

    /** * 插入排序 * * 原理:从数组中取出一个值插入到一个左边已经排好序的数组片段中 * * @param a * @return */ public long[] InsertSort(lon ...

  6. Linux命令之diff

    1.命令格式: diff[参数][文件1或目录1][文件2或目录2] 2.命令功能: diff命令能比较单个文件或者目录内容.如果指定比较的是文件,则只有当输入为文本文件时才有效.以逐行的方式,比较文 ...

  7. 面试准备 - C# 版本的树状数组

    树状数组 计算 任意连续N个值的和的时间复杂度为Log(n) 修改也是Log(n) 而普通数组修改是O(1) 计算和是O(n) 具体定义可以看这里:http://zh.wikipedia.org/zh ...

  8. JavaScript获取图片的原始尺寸

    页面里的img元素,想要获取它的原始尺寸,以宽度为例可能首先想到的就是width,如下 <img src="http://img11.360buyimg.com/da/g14/M07/ ...

  9. Android基于mAppWidget实现手绘地图(九)–如何处理地图对象的touch事件

    为了响应touch事件,需要设置OnMapTouchListener 示例: private void initMapEventsListener() { mapWidget.setOnMapTouc ...

  10. Network - curl和Wget

    curl - transfer a URL curl SYNOPSIS curl [options] [URL...] DESCRIPTION curl is a tool to transfer d ...