JS设计模式——7.工厂模式(概念)
工厂模式
本章讨论两种工厂模式:
简单工厂模式
使用一个类(通常是一个单体)来生成实例。
使用场景:假设你想开几个自行车商店(创建自行车实例,组装它,清洗它,出售它),每个店都有几种型号的自行车出售。
- /*=====================实现车==========================*/
- var Bicycle = new Interface('Bicycle', ['assemble', 'wash', 'ride', 'repair']);//Interface见2.初识接口那一章的用鸭式辨型模仿接口
- var Speedster = function(){ //实现Bicycle接口
- };
- Speedster.prototype = {
- assemble: function(){
- },
- wash: function(){
- },
- ride: function(){
- },
- repair: function(){
- }
- };
- /*=====================实现商店========================*/
- var BicycleFactory={ //单体形式的工厂
- createBicycle: function(model){
- var bicycle;
- switch (model){
- case 'The Speedster':
- bicycle = new Speedster();
- break;
- case 'The Lowrider':
- bicycle = new Lowrider();
- break;
- case 'The Comfort Cruiser':
- default:
- bicycle = new ComfortCruiser();
- }
- Interface.ensureImplements(bicycle, Bicycle); //Interface见2.初识接口那一章的用鸭式辨型模仿接口
- return bicycle;
- }
- }
- var BicycleShop = function(){};
- BicycleShop.prototype ={
- sellBicycle: function(model){
- var bicycle = BicycleFactory.createBicycle(model); //调用工厂
- bicycle.assemble();
- bicycle.wash();
- return bicycle;
- }
- };
- /*=====================开始卖车========================*/
- var shop1 = new BicycleShop();
- var soldBicycle = shop1.sellBicycle('The Speedster');
其实,我们完全可以将BicycleFacotry的实现放在BicycleShop.prototype中,那么,为什么会用上工厂模式?
用工厂模式之后就更加方便管理,当我们需要添加一种新的车型时,只需修改工厂就可以了,省得我们去修改BicycleShop。
复杂工厂模式
使用子类来决定一个成员变量应该是哪个具体的类的的实例(按照正式的定义,工厂是一个将其成员对象的实例化推迟到子类中进行的类)
同样的场景,我们打算让各个自行车商店自行决定从哪个生产厂家进货。
我们把BicycleShop设计为抽象类,让子类根据各自的进货渠道实现其createBicycle方法。
- /*=============================实现商店=================================*/
- /*=============抽象类BicycleShop============*/
- var BicycleShop = function() {};
- BicycleShop.prototype = {
- sellBicycle: function(model){
- var bicycle = this.createBicycle(model);
- bicycle.assemble();
- bicycle.wash();
- return bicycle;
- },
- createBicycle: function(model){
- throw new Error('Unsupported operation on an abstract class.');
- }
- };
- /*===========商店从Acme公司进货=============*/
- var AcmeBicycleShop = function() {};
- extend(AcmeBicycleShop, BicycleShop); //extend见4.继承(概念)
- AcmeBicycleShop.prototype.createBicycle = function(model){
- var bicycle;
- switch(model){
- case 'The Speedster':
- bicycle = new AcmeSpeedster();
- break;
- case 'The Lowrider':
- bicycle = new AcmeLowrider();
- break;
- case 'The Comfort Cruiser':
- default:
- bicycle = new AcmeComfortCruiser();
- }
- Interface.ensureImplements(bicycle, Bicycle);
- return bicycle;
- }
这里只是实现了商店,至于自行车的实现如上,就不再重复。
工厂模式的适用场合
创建对象的最简单的方法是使用new关键字和具体类.如果不知道工厂模式的适用场合,那么创建和维护工厂所带来的额外复杂性是得不偿失的.
动态实现
如果要像前面自行车的例子一样,创建一些用不同方式实现同一接口的对象,那么可以使用一个工厂方法或简单工厂对象来简化实现的过程.
节省设置开销
如果对象需要进行复杂并且彼此相关的设置,那么使用工厂模式可以减少每种对象所需的代码量.
如果这种设置只需为特定类型的所有实例执行一次即可,这种作用尤其突出.
如果所用的类要求加载外部库的话,这尤其有用.工厂方法可以对这些库进行检查并动态加载那些未找到的库.
这种设置只存在于一个地方,因此以后改起来也方便很多.
用许多小型对象组成一个大对象
工厂方法可以用来创建封装了许多较小对象的对象.
例如自行车包含许多更小的系统:车轮,车架,车闸等.如果你不想让某个子系统与较大的那个对象之间形成强耦合,而是想在运行是从许多子系统中进行挑选的话,那么工厂模式是一个理想的选择.
JS设计模式——7.工厂模式(概念)的更多相关文章
- [JS设计模式]:工厂模式(3)
简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况. 说的通俗点,就像公司茶水间的饮料 ...
- js设计模式:工厂模式、构造函数模式、原型模式、混合模式
一.js面向对象程序 var o1 = new Object(); o1.name = "宾宾"; o1.sex = "男"; o1.a ...
- JS设计模式之工厂模式
1 什么是工厂模式? 工厂模式是用来创建对象的一种最常用的设计模式.我们不暴露创建对象的具体逻辑,而是将将逻辑封装在一个函数中,那么这个函数就可以被视为一个工厂.工厂模式根据抽象程度的不同可以分为: ...
- JS设计模式--简单工厂模式
在JS中创建对象会习惯的使用new关键字和类构造函数(也是可以用对象字面量). 工厂模式就是一种有助于消除两个类依赖性的模式. 工厂模式分为简单工厂模式和复杂工厂模式,这篇主要讲简单工厂模式. 简单工 ...
- JS设计模式——7.工厂模式(示例-XHR)
XHR工厂 基本实现 var AjaxHandler = new Interface('AjaxHandler', ['request', 'createXHR']); var SimpleHandl ...
- JS设计模式——7.工厂模式(示例-RSS阅读器)
RSS阅读器 由于我们只想跟RSS容器对象打交道,所以用一个工厂来实例化这些内部对象并把它们组装到一个RSS阅读器中. 使用工厂方法在好处在于,我们创建的RSS阅读器类不会与那些成员对象紧密耦合在一起 ...
- Java设计模式之工厂模式(Factory模式)介绍(转载)
原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...
- Java常见设计模式之工厂模式
工厂模式在我们日常的应用中应当算是比较广泛的一种设计模式了.今天让我们一起来学习一下,工厂的设计模式. 工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple F ...
- 设计模式——抽象工厂模式及java实现
设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...
随机推荐
- Inside Qt Series (全集,共十六篇,不同版本的Qt有不同的实现)
Inside Qt 系列 QObject这个 class 是 QT 对象模型的核心,绝大部分的 QT 类都是从这个类继承而来.这个模型的中心特征就是一个叫做信号和槽(signaland slot)的机 ...
- jQuery : 有关TypeError: invalid ‘in’ operand obj的错误
参考 lwx2615 的博客 ,网站: http://blog.csdn.net/lwx2615/article/details/9668777 由PHP返回一个json数据 $.ajax({ ur ...
- jquery datatables 添加跳转到指定页功能
项目中使用了jquery datatables 作为我们的数据表格组件,但是分页上没有跳转到指定页,需要自己重新写.解决方法如下: 在设置dataTables的默认属性里设置它的drawCallbac ...
- Scrapy初尝试
,python3.6版本 在看网上的安装的时候下一堆依赖,其实没有必要一个个的去装,pip直接分析依赖一块下载安装下来! 已经安装了pip模块 直接上 pip install scrapy 安装twi ...
- MT【127】点对个数两题之一【图论】
在平面上有\(n\) 个点$S={x_1,x_2\cdots,x_n}, $ 其中任意两个点之间的距离至少为 \(1\), 证明在这 \(n\) 个点中距离为 \(1\)的点对数不超过 \(3n\). ...
- Maximum Subarray - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 Maximum Subarray - LeetCode 注意点 最大值有可能是正负数交替着出现 解法 解法一:一次遍历即可.当sum小于0的时候就重新开始 ...
- 一步步创建第一个Docker App —— 1. 背景介绍
原文:https://docs.docker.com/engine/getstarted-voting-app/#/docker-stacks-and-services 你将会学习什么 本文创建 ...
- BZOJ2159 Crash 的文明世界 【第二类斯特林数 + 树形dp】
题目链接 BZOJ2159 题解 显然不能直接做点分之类的,观察式子中存在式子\(n^k\) 可以考虑到 \[n^k = \sum\limits_{i = 0} \begin{Bmatrix} k \ ...
- 【SDOI2015】序列统计 解题报告
2119: [BZOJ3992][SDOI2015]序列统计 Description 小\(C\)有一个集合\(S\),里面的元素都是小于\(M\)的非负整数. 他用程序编写了一个数列生成器,可以生成 ...
- jquery的serializeArray、param 与serializeArray 的区别与源码解析
jQuery.param( obj, traditional ) 为url查询或者ajax 将对象或者数组转为url参数或ajax参数,是挂在jQuery对象上的静态方法,有码有真相: var myI ...