工厂模式

本章讨论两种工厂模式:

简单工厂模式

使用一个类(通常是一个单体)来生成实例。

使用场景:假设你想开几个自行车商店(创建自行车实例,组装它,清洗它,出售它),每个店都有几种型号的自行车出售。

  1. /*=====================实现车==========================*/
  2. var Bicycle = new Interface('Bicycle', ['assemble', 'wash', 'ride', 'repair']);//Interface见2.初识接口那一章的用鸭式辨型模仿接口
  3. var Speedster = function(){ //实现Bicycle接口
  4.  
  5. };
  6. Speedster.prototype = {
  7. assemble: function(){
  8.  
  9. },
  10. wash: function(){
  11.  
  12. },
  13. ride: function(){
  14.  
  15. },
  16. repair: function(){
  17.  
  18. }
  19. };
  20. /*=====================实现商店========================*/
  21. var BicycleFactory={ //单体形式的工厂
  22. createBicycle: function(model){
  23. var bicycle;
  24. switch (model){
  25. case 'The Speedster':
  26. bicycle = new Speedster();
  27. break;
  28. case 'The Lowrider':
  29. bicycle = new Lowrider();
  30. break;
  31. case 'The Comfort Cruiser':
  32. default:
  33. bicycle = new ComfortCruiser();
  34. }
  35. Interface.ensureImplements(bicycle, Bicycle); //Interface见2.初识接口那一章的用鸭式辨型模仿接口
  36. return bicycle;
  37. }
  38. }
  39. var BicycleShop = function(){};
  40. BicycleShop.prototype ={
  41. sellBicycle: function(model){
  42. var bicycle = BicycleFactory.createBicycle(model); //调用工厂
  43. bicycle.assemble();
  44. bicycle.wash();
  45. return bicycle;
  46. }
  47. };
  48. /*=====================开始卖车========================*/
  49. var shop1 = new BicycleShop();
  50. var soldBicycle = shop1.sellBicycle('The Speedster');

其实,我们完全可以将BicycleFacotry的实现放在BicycleShop.prototype中,那么,为什么会用上工厂模式?

用工厂模式之后就更加方便管理,当我们需要添加一种新的车型时,只需修改工厂就可以了,省得我们去修改BicycleShop。

复杂工厂模式

使用子类来决定一个成员变量应该是哪个具体的类的的实例(按照正式的定义,工厂是一个将其成员对象的实例化推迟到子类中进行的类)

同样的场景,我们打算让各个自行车商店自行决定从哪个生产厂家进货。

我们把BicycleShop设计为抽象类,让子类根据各自的进货渠道实现其createBicycle方法。

  1. /*=============================实现商店=================================*/
  2. /*=============抽象类BicycleShop============*/
  3. var BicycleShop = function() {};
  4. BicycleShop.prototype = {
  5. sellBicycle: function(model){
  6. var bicycle = this.createBicycle(model);
  7. bicycle.assemble();
  8. bicycle.wash();
  9. return bicycle;
  10. },
  11. createBicycle: function(model){
  12. throw new Error('Unsupported operation on an abstract class.');
  13. }
  14. };
  15. /*===========商店从Acme公司进货=============*/
  16. var AcmeBicycleShop = function() {};
  17. extend(AcmeBicycleShop, BicycleShop); //extend见4.继承(概念)
  18. AcmeBicycleShop.prototype.createBicycle = function(model){
  19. var bicycle;
  20. switch(model){
  21. case 'The Speedster':
  22. bicycle = new AcmeSpeedster();
  23. break;
  24. case 'The Lowrider':
  25. bicycle = new AcmeLowrider();
  26. break;
  27. case 'The Comfort Cruiser':
  28. default:
  29. bicycle = new AcmeComfortCruiser();
  30. }
  31. Interface.ensureImplements(bicycle, Bicycle);
  32. return bicycle;
  33. }

这里只是实现了商店,至于自行车的实现如上,就不再重复。

工厂模式的适用场合

创建对象的最简单的方法是使用new关键字和具体类.如果不知道工厂模式的适用场合,那么创建和维护工厂所带来的额外复杂性是得不偿失的.

动态实现

如果要像前面自行车的例子一样,创建一些用不同方式实现同一接口的对象,那么可以使用一个工厂方法或简单工厂对象来简化实现的过程.

节省设置开销

如果对象需要进行复杂并且彼此相关的设置,那么使用工厂模式可以减少每种对象所需的代码量.

如果这种设置只需为特定类型的所有实例执行一次即可,这种作用尤其突出.

如果所用的类要求加载外部库的话,这尤其有用.工厂方法可以对这些库进行检查并动态加载那些未找到的库.

这种设置只存在于一个地方,因此以后改起来也方便很多.

用许多小型对象组成一个大对象

工厂方法可以用来创建封装了许多较小对象的对象.

例如自行车包含许多更小的系统:车轮,车架,车闸等.如果你不想让某个子系统与较大的那个对象之间形成强耦合,而是想在运行是从许多子系统中进行挑选的话,那么工厂模式是一个理想的选择.

JS设计模式——7.工厂模式(概念)的更多相关文章

  1. [JS设计模式]:工厂模式(3)

    简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况. 说的通俗点,就像公司茶水间的饮料 ...

  2. js设计模式:工厂模式、构造函数模式、原型模式、混合模式

    一.js面向对象程序 var o1 = new Object();     o1.name = "宾宾";     o1.sex = "男";     o1.a ...

  3. JS设计模式之工厂模式

    1 什么是工厂模式? 工厂模式是用来创建对象的一种最常用的设计模式.我们不暴露创建对象的具体逻辑,而是将将逻辑封装在一个函数中,那么这个函数就可以被视为一个工厂.工厂模式根据抽象程度的不同可以分为: ...

  4. JS设计模式--简单工厂模式

    在JS中创建对象会习惯的使用new关键字和类构造函数(也是可以用对象字面量). 工厂模式就是一种有助于消除两个类依赖性的模式. 工厂模式分为简单工厂模式和复杂工厂模式,这篇主要讲简单工厂模式. 简单工 ...

  5. JS设计模式——7.工厂模式(示例-XHR)

    XHR工厂 基本实现 var AjaxHandler = new Interface('AjaxHandler', ['request', 'createXHR']); var SimpleHandl ...

  6. JS设计模式——7.工厂模式(示例-RSS阅读器)

    RSS阅读器 由于我们只想跟RSS容器对象打交道,所以用一个工厂来实例化这些内部对象并把它们组装到一个RSS阅读器中. 使用工厂方法在好处在于,我们创建的RSS阅读器类不会与那些成员对象紧密耦合在一起 ...

  7. Java设计模式之工厂模式(Factory模式)介绍(转载)

    原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...

  8. Java常见设计模式之工厂模式

    工厂模式在我们日常的应用中应当算是比较广泛的一种设计模式了.今天让我们一起来学习一下,工厂的设计模式. 工厂模式在<Java与模式>中分为三类:     1)简单工厂模式(Simple F ...

  9. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

随机推荐

  1. Inside Qt Series (全集,共十六篇,不同版本的Qt有不同的实现)

    Inside Qt 系列 QObject这个 class 是 QT 对象模型的核心,绝大部分的 QT 类都是从这个类继承而来.这个模型的中心特征就是一个叫做信号和槽(signaland slot)的机 ...

  2. jQuery : 有关TypeError: invalid ‘in’ operand obj的错误

    参考 lwx2615 的博客 ,网站:  http://blog.csdn.net/lwx2615/article/details/9668777 由PHP返回一个json数据 $.ajax({ ur ...

  3. jquery datatables 添加跳转到指定页功能

    项目中使用了jquery datatables 作为我们的数据表格组件,但是分页上没有跳转到指定页,需要自己重新写.解决方法如下: 在设置dataTables的默认属性里设置它的drawCallbac ...

  4. Scrapy初尝试

    ,python3.6版本 在看网上的安装的时候下一堆依赖,其实没有必要一个个的去装,pip直接分析依赖一块下载安装下来! 已经安装了pip模块 直接上 pip install scrapy 安装twi ...

  5. MT【127】点对个数两题之一【图论】

    在平面上有\(n\) 个点$S={x_1,x_2\cdots,x_n}, $ 其中任意两个点之间的距离至少为 \(1\), 证明在这 \(n\) 个点中距离为 \(1\)的点对数不超过 \(3n\). ...

  6. Maximum Subarray - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Maximum Subarray - LeetCode 注意点 最大值有可能是正负数交替着出现 解法 解法一:一次遍历即可.当sum小于0的时候就重新开始 ...

  7. 一步步创建第一个Docker App —— 1. 背景介绍

    原文:https://docs.docker.com/engine/getstarted-voting-app/#/docker-stacks-and-services 你将会学习什么    本文创建 ...

  8. BZOJ2159 Crash 的文明世界 【第二类斯特林数 + 树形dp】

    题目链接 BZOJ2159 题解 显然不能直接做点分之类的,观察式子中存在式子\(n^k\) 可以考虑到 \[n^k = \sum\limits_{i = 0} \begin{Bmatrix} k \ ...

  9. 【SDOI2015】序列统计 解题报告

    2119: [BZOJ3992][SDOI2015]序列统计 Description 小\(C\)有一个集合\(S\),里面的元素都是小于\(M\)的非负整数. 他用程序编写了一个数列生成器,可以生成 ...

  10. jquery的serializeArray、param 与serializeArray 的区别与源码解析

    jQuery.param( obj, traditional ) 为url查询或者ajax 将对象或者数组转为url参数或ajax参数,是挂在jQuery对象上的静态方法,有码有真相: var myI ...