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

工厂模式:

工厂模式的目的是为了方便的创建对象(可以在不知道构造的情况下),通过静态方法来实现,在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操作,而装饰模式可以将对象进行组合从而实现代码的复用。

转载于:https://www.cnblogs.com/vipyoumay/p/4742085.html

javascript模式 (3)——工厂模式和装饰模式相关推荐

  1. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  2. JavaScript设计模式———抽象工厂模式

    定义: 抽象工厂其实是实现子类继承父类的方法,只是一个方法.抽象工厂模式一般用在多人协作的超大型项目中,并且严格的要求项目以面向对象的思想进行完成. 简单工厂模式和工厂模式都是直接生产实例的,抽象工厂 ...

  3. 设计模式-策略模式,观察者模式,装饰者模式,静态工厂模式,工厂方法模式

    设计模式这个东西,永远不是单单从书本上就能获取到的东西.曾经看到一个比喻,比喻的就很巧妙,文艺复兴时期的教学方式,那时候诞生了很多巨匠,达芬奇,莫开朗基罗,拉斐尔都是在这个时期绽放光芒的巨星.有一种说 ...

  4. 创建型模式 简单工厂模式

    创建型模式 简单工厂模式 /*** 创建型模式 简单工厂模式* 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类.** ...

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

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

  6. php注册树模式,php基础设计模式大全(注册树模式、工厂模式、单列模式)

    废话不多说了,先给大家介绍注册树模式然后介绍工厂模式最后给大家介绍单列模式,本文写的很详细,一起来学习吧. php注册树模式 什么是注册树模式? 注册树模式当然也叫注册模式,注册器模式.之所以我在这里 ...

  7. 设计模式-策略模式和工厂模式结合使用

    怎么把策略模式和工厂模式结合起来使用 如果大家对策略模式和工厂模式不是很了解的话可以先看前面文章 策略模式:https://www.jianshu.com/p/958281936901 工厂模式:ht ...

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

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

  9. 创建型模式——抽象工厂模式

    一. 实验目的与要求 1.练习使用工厂模式.设计相关的模拟场景并进行实施,验证模式特性,掌握其优缺点. 2.实验结束后,对相关内容进行总结. 二.实验内容 1.模式应用场景说明 手机CPU生产工厂:在 ...

  10. 设计模式---5(建造者模式的概念及其实现,建造者模式的角色与职责,建造者模式和工厂模式的区别)

    建造者模式 建造者模式的概念 Builder 模式也叫建造者模式或者生成器模式,是由 GoF 提出的 23 种设计模式中的一种. Builder 模式是一种对象创建型模式之一,用来隐藏复合对象的创建过 ...

最新文章

  1. 小米node2红外_使用python-miio控制小米智能插座
  2. 商汤作价1026亿IPO,商业化汤教授身家220亿
  3. ActiveXObject函数详解
  4. 独家揭秘 | 腾讯、Uber都在哪儿招人
  5. R语言空间数据处理(part2)--空间数据读写
  6. wget整站抓取、网站抓取功能;下载整个网站;下载网站到本地
  7. 云+X案例展 | 民生类:纷享销客助力沃得农机构筑智能化、信息化之路
  8. JS对象与JSON串互转
  9. Leetcode——1. Two Sum
  10. java枚举对象作用_浅析Java编程中枚举类型的定义与使用
  11. 用python写个小游戏难吗_小伙用Python制做一个小游戏,结果6秒就结束,怎么难玩?...
  12. PS破解版全网下架?这款国产工具可完美替代
  13. Mac 上使用windows软件--wineskin
  14. 软件测试是不是IT行业最容易学的 ,大概需要多长时间,就业前景好吗?
  15. android 指纹是否设置,检查Android是否支持指纹识别以及是否已经录入指纹
  16. ActionEnglish Notes
  17. Android内存泄漏总结,年薪超过80万!
  18. 药企如何选型医药CRM
  19. SPACESNIFFER查看文件大小
  20. php源生curl对接paypal

热门文章

  1. 计算机装调与维护报告,Vmware workstation在计算机装调与维护实训中的应用
  2. 有基础学python看什么书好_python入门学习看什么书好,有什么书籍推荐
  3. php接收url的json,api-php中url接收的json数据,json_decode为空
  4. 巴西矿坝决堤事故已致58人死亡 多达300人失踪
  5. 关于线程join方法的理解
  6. 事务Transaction 那点事儿
  7. spring StopWatch用法
  8. spoolsv进程占用CPU近100%,电脑反应慢
  9. android沉浸状态栏工具,Android 状态栏工具——一行代码实现状态栏...
  10. django mysql 登陆界面_django 简单实现登录验证给你 Django用户登录验证跳转问题