1 什么是工厂模式?

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

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式

 1-1 简单工厂模式

  简单工厂模式,又叫静态工厂方法,由一个工厂对象来决定创建某一种产品对象类的实例,主要用来创建同一类对象。

  1. var basketball = function(){
  2. this.title = '篮球';
  3. }
  4.  
  5. basketball.prototype = {
  6. getMenberNum :function(){
  7. console.log('5个人');
  8. },
  9. getPlayAction:function(){
  10. console.log('投篮')
  11. }
  12. }
  13.  
  14. var football = function(){
  15. this.title = '足球';
  16. }
  17.  
  18. football.prototype = {
  19. getMenberNum :function(){
  20. console.log('11个人');
  21. },
  22. getPlayAction:function(){
  23. console.log('射门')
  24. }
  25. }
  26.  
  27. var factory = function(type){
  28. switch(type){
  29. case 'basketball': return new basketball();
  30. case 'football': return new football();
  31. }
  32. }
  33.  
  34. //然后我们就可以这么用
  35. oPlay = factory('basketball');
  36. oPlay.getMenber();
  37.  
  38. oPlay2 = factory('football');
  39. oPlay2.getPlayAction();
如果两个类的共有属性比较多的时候,我们可以这样用
  1. var factory = function(name,age,sex,national){
  2. var obj = {};
  3. obj.name = name;
  4. obj.age = age;
  5. obj.sex = sex;
  6. switch(national){
  7. case 'Chinese':
  8. obj.speak = function(){
  9. console.log('Speak Chinese');
  10. };
  11. break;
  12. case 'England':
  13. obj.speak = function(){
  14. console.log('SpeakEnglish')
  15. };
  16. break;
  17. }
  18. return obj;
  19. }
  20.  
  21. var person = new factory("Jack",'','Man',"Chinese");
  22. person.speak();
简单工厂的优点在于,你只需要一个正确的参数,就可以获取到你所需要的对象,而无需知道其创建的具体细节。但是在函数内包含了所有对象的创建逻辑(构造函数)和判断逻辑的代码,每增加新的构造函数还需要修改判断逻辑代码。当我们的对象不是上面的3个而是30个或更多时,这个函数会成为一个庞大的超级函数,便得难以维护。所以,简单工厂只能作用于创建的对象数量较少,对象的创建逻辑不复杂时使用
 

 1-2 工厂方法模式

工厂方法模式,通过对产品类的抽象使其创建业务主要负责用于创建多类产品的实例。

  1.   var Court = function (type, content) {
  2. if (this instanceof Court) {
  3. return new this[type](content);
  4. } else {
  5. return new Court(type, content);
  6. }
  7. }
  8.  
  9. Court.prototype = {
  10. basketball : function (content) {
  11. this.content = content;
  12. (function (content) {
  13. console.log(content + 'basketball');
  14. })(content);
  15. },
  16. football : function (content) {
  17. this.content = content;
  18. (function (content) {
  19. console.log(content + 'football');
  20. })(content);
  21. }
  22. }
  23.  
  24. var data = [{
  25. type: 'basketball',
  26. content: '5人打'
  27. },
  28. {
  29. type: 'football',
  30. content: '11人踢'
  31. }
  32. ];
  33.  
  34. for (var i = ; i < data.length; i++) {
  35. Court(data[i].type, data[i].content);
  36. }

    // 5人打basketball
    // 11人踢football

  对于创建多类对象,简单工厂就不太实用了。

  通过工厂方法模式可以轻松的创建多个类的实例对象,而且创建对象的方式避免了使用者与对象类之间的耦合,用户不必关心创建该对象的具体类,只需调用工厂方法即可。

  1-3 抽象工厂模式

    抽象工厂模式,通过对类的工厂抽象使其业务用于对产品类簇的创建,而不负责创建某一类产品的实例。

  1. /*定义一个抽象类 AbsProducer(生产商),该生产商有两个行为,一个生产,一个出售,其中生产方法为抽象方法,由具体的厂家去实现*/
  2. var AbsProducer = function(){};
  3. AbsProducer.prototype = {
  4.  
  5. sell:function(name){
  6. var product = this.create(model);
  7. product.showName();
  8. return product;
  9. },
  10. create:function(name){
  11. throw new Error("抽象类不支持该操作");
  12. }
  13. }

  联想工厂:LenovoFactory.js

  1. var LenovoFactory = function () {};
  2. extend(LenovoFactory, AbsProducer);
  3. LenovoFactory.prototype.create = function (name) {
  4. var product;
  5. switch (name) {
  6. case "phone":
  7. product = new LenovoPhone();
  8. break;
  9. case "computer":
  10. product = new LenovoComputer();
  11. break;
  12. }
  13. Interface.ensureImplements(product, ElectronicProduct);
  14. product.showName();
  15. return product;
  16. }
  17.  
  18. function LenovoPhone() {};
  19. LenovoPhone.prototype = {
  20. showName: function () {
  21. console.log("我是联想厂商生产的手机,取名为Lenovo-phone");
  22. },
  23. showCpu: function () {
  24. console.log("联想手机cpu一般般咯");
  25. },
  26. showSysType: function () {
  27. console.log("姑且认为联想手机系统为WP吧");
  28. }
  29. };
  30.  
  31. function LenovoComputer() {};
  32. LenovoComputer.prototype = {
  33. showName: function () {
  34. console.log("我是联想厂商生产的电脑,型号为Y系列");
  35. },
  36. showCpu: function () {
  37. console.log("联想电脑cpu,四代I7处理器");
  38. },
  39. showSysType: function () {
  40. console.log("联想电脑系统为正版win7");
  41. }
  42. };

  苹果工厂:AppleFactory.js

  1. var AppleFactory = function () {};
  2. extend(AppleFactory, AbsProducer);
  3. AppleFactory.prototype.create = function (name) {
  4. var product;
  5. switch (name) {
  6. case "phone":
  7. product = new Iphone();
  8. break;
  9. case "computer":
  10. product = new Mac();
  11. break;
  12. }
  13. Interface.ensureImplements(product, ElectronicProduct);
  14. product.showName();
  15. return product;
  16. };
  17.  
  18. function Iphone() {};
  19. Iphone.prototype = {
  20. showName: function () {
  21. console.log("我是苹果公司生产的手机,取名为Iphone");
  22. },
  23. showCpu: function () {
  24. console.log("iphone手机CPU是基于ARM架构重新设计的");
  25. },
  26. showSysType: function () {
  27. console.log("iphone系统为IOS9");
  28. }
  29. };
  30.  
  31. function Mac() {};
  32. Mac.prototype = {
  33. showName: function () {
  34. console.log("我是苹果公司生产的电脑,取名为Mac");
  35. },
  36. showCpu: function () {
  37. console.log("mac cpu还不错吧");
  38. },
  39. showSysType: function () {
  40. console.log("mac系统为OS X");
  41. }
  42. };

  调用:

  1. /*定义了一个ElectronicProduct电子产品的接口,该接口有以下几个名称*/
  2. var ElectronicProduct = new Interface("ElectronicProduct",["showName", "showCpu", "showSysType"]);
  3. //这里你想要哪个品牌的电子产品,直接new一个该品牌的工厂即可。
  4. var factory = new AppleFactory();
  5. var product = factory.create("phone");
  6. product.showSysType();
  7. product.showCpu();

抽象工厂其实是一个实现子类继承父类的方法,在这个方法种我我们需要传入子类以及要继承父类的名称.
过渡类的原型继承,不是继承父类的原型,而是通过new 复制一个父类的实例,过渡类不仅仅继承了父类的原型方法,还继承了父类的对象属性.

JS设计模式之工厂模式的更多相关文章

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

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

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

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

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

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

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

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

  5. JS设计模式——7.工厂模式(概念)

    工厂模式 本章讨论两种工厂模式: 简单工厂模式 使用一个类(通常是一个单体)来生成实例. 使用场景:假设你想开几个自行车商店(创建自行车实例,组装它,清洗它,出售它),每个店都有几种型号的自行车出售. ...

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

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

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

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

  8. 5. 星际争霸之php设计模式--抽象工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  9. 3. 星际争霸之php设计模式--简单工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

随机推荐

  1. Python之包管理

    1.setup.py from distutils.core import setup setup(name='Distutils', version='1.0', description='Pyth ...

  2. Java IO--NIO(一)

    一.基本概念描述 1.1 I/O简介 I/O即输入输出,是计算机与外界世界的一个接口.IO操作的实际主题是操作系统.在java编程中,一般使用流的方式来处理IO,所有的IO都被视作是单个字节的移动,通 ...

  3. 解决 Bash On Windows 下载慢或无法下载的问题

    解决 Bash On Windows "无法从 Windows 应用商店下载.请检查网络连接."的问题 Fiddler和Bash On Windows 源离线压缩包:http:// ...

  4. axios、ajax、fetch三者的区别

    1.ajax:是指一种创建交互式网页应用的网页开发技术,并且可以做到无需重新加载整个网页的情况下,能够更新部分网页,也叫作局部更新 优缺点: 1)局部更新 2)原生支持,不需要任何插件 3)原生支持, ...

  5. 基于ROS和beaglebone的串口通信方式,使用键盘控制移动机器人

    一.所需工具包 1.ROS键盘包:teleop_twist_keyboard  2.ROS串口通讯包:serial $ cd ~/catkin_ws/src $ git clone https://g ...

  6. PhpStorm 2017破解

    最新版PhpStorm 2017正式版改进了PHP 7支持,改进代码完成功能. PhpStorm 是最好的PHP开发工具,使用它进行PHP开发将会让你感觉到编程的乐趣. 快乐无极终于从oschina看 ...

  7. poj2142 The Balance

    poj2142 The Balance exgcd 应分为2种情况分类讨论 显然我们可以列出方程 ax-by=±d 当方程右侧为-d时,可得 by-ax=d 于是我们就得到了2个方程: ax-by=d ...

  8. 使用curl自动签到百度贴吧

    百度贴吧的一键签到接口地址为 http://tieba.baidu.com/tbmall/onekeySignin1 curl http://tieba.baidu.com/tbmall/onekey ...

  9. JS设计模式(9)享元模式

    什么是享元模式? 定义:享元模式是一种优化程序性能的模式,本质为减少对象创建的个数. 主要解决:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存 ...

  10. 【Git】Git使用记录: 撤回已经commit到本地的提交记录

    话不多说直接上步骤: git bash直接干到你的code. 直接敲命令: git reset --soft HEAD~1 搞定 就是这么简单粗暴. 如有顾虑请自行找个案例测试即可. 参考资料 htt ...