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实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...
 
随机推荐
- QTime的本质上是一个int,QDateTime本质上是一个qint64
			
研究这个问题的起因发现使用<=比较时间的不准确,所以怀疑是一个浮点数(Delphi里的time就是一个浮点数).结果却发现是一个int class Q_CORE_EXPORT QTime { e ...
 - getcontext makecontext setcontext swapcontext介绍
			
ucontext簇函数学习 https://github.com/zfengzhen/Blog/blob/master/article/ucontext%E7%B0%87%E5%87%BD%E6%95 ...
 - 【CSS】规范大纲
			
文件规范: 文件分类 : 通用类 :业务类. 文件引入:行内样式(不推荐):外联引入:内联引入.(避免使用Import引入) 文件本身:文件名. 编码:UTF-8. 注释规范: 块状注释:统一缩进,在 ...
 - UFLDL学习笔记 ---- 主成分分析与白化
			
主成分分析(PCA)是用来提升无监督特征学习速度的数据降维算法.看过下文大致可以知道,PCA本质是对角化协方差矩阵,目的是让维度之间的相关性最小(降噪),保留下来的维度能量最大(去冗余),PCA在图像 ...
 - 1.红黑树和自平衡二叉(查找)树区别 2.红黑树与B树的区别
			
1.红黑树和自平衡二叉(查找)树区别 1.红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单. 2.平衡 ...
 - 【转】查看 Linux 发行版名称和版本号的 8 种方法
			
如果你加入了一家新公司,要为开发团队安装所需的软件并重启服务,这个时候首先要弄清楚它们运行在什么发行版以及哪个版本的系统上,你才能正确完成后续的工作.作为系统管理员,充分了解系统信息是首要的任务. 查 ...
 - SpringBoot的基础
			
概念 Spring的优缺点 1. 优点(AOP和IOC简化开发) Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品.无需开发重量级的E ...
 - Linux日常维护命令
			
对于程序员来说,掌握一些基本的Linux命令是必不可少的,即使现在用不到,在不久的将来也应该会用到.由于Linux有很多命令,每个命令基本可以用一篇文章介绍,所以本文仅总结一些常用命令的常用用法,如有 ...
 - python定义函数以及参数检查
			
(转自廖雪峰网站) 函数定义 在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义 ...
 - Linux应用程序设计之网络基础编程
			
1.TCP/IP协议概述 1.1.OSI参考模型及TCP/IP参考模型 OSI协议参考模型是基于国际标准化组织(ISO)的建议发展起来的,从上到下工分为7层:应用层,表示层,会话层,传输层,网络层,数 ...