浅谈js抽象工厂模式

一。简单工厂

定义:简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

比如你去专门卖鼠标的地方你可以买各种各样的鼠标

function mouse(color,long){

    var o = new Object();

    o.color= color;

    o.long= long; 

    o.Explain= function(){

      console.log(this.color,this.long);

    }

    return o;

  }

var mouseA = mouse(‘黑色‘,3);

二。工厂模式

定义:工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。

比如去旁边还有个专门卖键盘的和耳机的然后他和卖鼠标的组成了一个门店

你要进如这个门店然后买鼠标或者键盘或者耳机

你可以把这个工厂模式理解成是  进化版的简单工厂模式

shop= function(val) {
  if(typeof this === "object") { //看看有没有new   没有new的话new一个
    var s = new this[val]();
    return s;
  } else {
    return new shop(val);
  }
}

shop.prototype = {
  mouse: function() {
    console.log("买了个鼠标")
  },
  keyboard: function() {
console.log("买了个键盘")
 }, headset: function() {
console.log("买了个耳机")
 } }
 bigShop = new shop();
 mouse = new bigshop.mouse();
 

上边那个new之前也看了很多例子有的有 有的没有  后来发现因为mousekeyboardheadset等构造函数保存到了shop.prototype中,也就意味着我们必须实例化shop函数才能够进行以上对象的实例化

三。抽象工厂模式

定义:抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。

前边的两个都是直接生产实例的,开始以为抽象工厂也是但是后来发现抽象工厂更像是生产工厂,其实抽象工厂其实是实现子类继承父类的方法。

说白了 抽象工厂模式   我认为就是工厂功能模式的扩充版,简单工厂生产实例  ,工厂功能模式生产实例的接口,抽象工厂呢生产的是工厂

比如说上边他们有了个电脑店的门店  现在电脑店火了 又开了一个电脑店  然后这两个电脑店一个是联想的  一个是戴尔的

核心代码let agency = function(subType, superType) {
  //判断抽象工厂中是否有该抽象类
  if(typeof agency[superType] === ‘function‘) {
    function F() {};
    //继承父类属性和方法
    F.prototype = new agency[superType] ();
    //将子类的constructor指向子类
    subType.constructor = subType;
    //子类原型继承父类
    subType.prototype = new F();

  } else {
    throw new Error(‘抽象类不存在!‘)
  }
}

这个 subType.constructor = subType;  是子类指向自己  下边放上效果图

这是创建工厂的类   好比专卖店

//鼠标抽象类
agency.mouseShop = function() {
  this.type = ‘鼠标‘;
}
agency.mouseShop.prototype = {
  getName: function() {
    return new Error(‘抽象方法不能调用‘);
  }
}

//键盘抽象类
agency.KeyboardShop = function() {
  this.type = ‘键盘‘;
}
agency.KeyboardShop.prototype = {
  getName: function() {
    return new Error(‘抽象方法不能调用‘);
  }
}

//普通鼠标子类
function mouse(name) {
  this.name = name;
  this.item = [‘买我,我线长‘,"玩游戏贼溜"]
}
//抽象工厂实现鼠标类的继承
agency(mouse, ‘mouseShop‘);
//子类中重写抽象方法
mouse.prototype.getName = function() {
  return this.name;
}

//普通键盘子类
function Keyboard(name) {
  this.name = name;
  this.item = [‘行,你买它吧‘,"没键盘看你咋玩"]
}
//抽象工厂实现键盘类的继承
agency(Keyboard, ‘KeyboardShop‘);
//子类中重写抽象方法
Keyboard.prototype.getName = function() {
  return this.name;
}

最后放一下全部代码

let agency = function(subType, superType) {
  //判断抽象工厂中是否有该抽象类
  if(typeof agency[superType] === ‘function‘) {
    function F() {};
    //继承父类属性和方法
    F.prototype = new agency[superType] ();
    //将子类的constructor指向子类
    subType.constructor = subType;
    //子类原型继承父类
    subType.prototype = new F();

  } else {
    throw new Error(‘抽象类不存在!‘)
  }
}

//鼠标抽象类
agency.mouseShop = function() {
  this.type = ‘鼠标‘;
}
agency.mouseShop.prototype = {
  getName: function() {
    return new Error(‘抽象方法不能调用‘);
  }
}

//键盘抽象类
agency.KeyboardShop = function() {
  this.type = ‘键盘‘;
}
agency.KeyboardShop.prototype = {
  getName: function() {
    return new Error(‘抽象方法不能调用‘);
  }
}

//普通鼠标子类
function mouse(name) {
  this.name = name;
  this.item = [‘买我,我线长‘,"玩游戏贼溜"]
}
//抽象工厂实现鼠标类的继承
agency(mouse, ‘mouseShop‘);
//子类中重写抽象方法
mouse.prototype.getName = function() {
  return this.name;
}

//普通键盘子类
function Keyboard(name) {
  this.name = name;
  this.item = [‘行,你买它吧‘,"没键盘看你咋玩"]
}
//抽象工厂实现键盘类的继承
agency(Keyboard, ‘KeyboardShop‘);
//子类中重写抽象方法
Keyboard.prototype.getName = function() {
  return this.name;
}

//实例化鼠标
let mouseA = new mouse(‘联想‘);
console.log(mouseA.getName(), mouseA.type); //联想 鼠标
let mouseB = new mouse(‘戴尔‘);
console.log(mouseB.getName(), mouseB.type); //戴尔 鼠标

//实例化键盘
let KeyboardA = new Keyboard(‘联想‘);
console.log(KeyboardA.getName(), KeyboardA.type); //联想 键盘
let KeyboardB = new Keyboard(‘戴尔‘);
console.log(KeyboardB.getName(), KeyboardB.type); //戴尔 键盘

我觉得这个抽象工厂的话    相对前两种而言   如果抽象函数比较全的话  可能少了很多的new吧    组合比较灵活

抽象工厂不直接创建实例,个人认为在大型项目的话应该蛮实用的。

以上是个人的见解,接触不多,有说的不对或不足之处,请批评指正。

原文地址:https://www.cnblogs.com/netUserAdd/p/10404150.html

时间: 2024-11-10 14:05:19

浅谈js抽象工厂模式的相关文章

菜鸟之路-浅谈设计模式之工厂模式

工厂模式 工厂模式是我们最经常使用的实例化对象模式了,是用工厂方法取代new操作的一种模式. 著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统能够说是随处可见. 由于工厂模式就相当于创建实例对象的new.我们经常要依据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,能否够考虑使用工厂模式,尽管这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的改动量. 工厂模式定义 我们以类Sample为例,

js抽象工厂模式

抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂允许客户使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么.这样客户就可以从具体产品中被解耦.下面通过抽象工模式的类图来了解各个类中之间的关系: 抽象工厂的分析 抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这 样更有利于后期的维护和扩展,这真是抽象工厂模式的优点所在,然后抽象模式同时也存

浅谈设计模式之工厂类模式由简单到复杂的演变

前言 在软件设计过程中,我们总是需要创建很多对象,而且系统越庞大,创建的对象越复杂.而今天我们将讨论的就是解决对象创建时的难题--工厂类模式.为了贴近工厂这个词,我们采用工厂建造汽车这个例子来阐明工厂类模式的演变和什么场景下使用什么模式. 场景1.:一位顾客要开车从上海到苏州,他需要一辆汽车,于是他自己组装汽车,给车装轮胎.导航仪.车灯等. 问题:1.显然,顾客只是想拥有一辆汽车,他不想知道怎么去买汽车,更不想知道怎么组装,然后还要给汽车上漆. 2.如果他想换个型号的汽车,他得重新来遍组装汽车.

从实例谈OOP、工厂模式和重构

有了翅膀才能飞, 欠缺灵活的代码就象冻坏了翅膀的鸟儿.不能飞翔,就少了几许灵动的气韵.我们需要给代码带去温暖的阳光, 让僵冷的翅膀重新飞起来. 结合实例, 通过应用OOP.设计模式和重构,你会看到代码是怎样一步一步复活的. 为了更好的理解设计思想, 实例尽可能简单化. 但随着需求的增加,程序将越来越复杂. 此时就有修改设计的必要, 重构和设计模式就可以派上用场了. 最后当设计渐趋完美后,你会发现, 即使需求不断增加,你也可以神清气闲,不用为代码设计而烦恼了. 假定我们要设计一个媒体播放器. 该媒

浅谈设计模式1-策略模式

对于大多数面向对象的初学者来说,将思维模式从面向过程转变过来是一个比较困难的过程.很多人在用面向对象语言编写程序的时候,依然会感觉自己在用面向过程的思维,笔者分享这篇文章的用意便是希望可以对大家有一些积极的影响. 阅读本文可以是没有接触设计模式,但需要一定的面向对象基础,至少简单理解封装,继承多态. 对于刚开始接触设计模式来说,一开始就说概念性的东西,很少能够理解.所以我们可以先跳过这些,通过一个小的程序场景来进行一个比较直观的认识. 模拟魂斗罗发射子&弹 相信大家小的时候玩过一款叫魂斗罗的游戏

设计模式之创建型抽象工厂模式

通过对类的工厂抽象使其业务用于对产品类簇的创建,而不负责某一类产品的实例.抽象类是一种声明但不能使用的类,当你使用的时候就会报错.JavaScript中的抽象类不能像传统面向对象语言那样轻松地创建,我们可以在类的方法中手动抛出错误来模拟抽象类.你可能会想,这样的类什么都不能做有什么用?其实它在继承上是很有用的.抽象工厂模式不能用来创建具体对象,一般用它作为父类创建一些子类. // 抽象工厂方法 var PageFactory = function(parent, child) { // 判断抽象

(五) 抽象工厂模式

转载:http://www.cnblogs.com/zuoxiaolong/p/pattern6.html 前两章我们已经讨论了两种有关工厂的模式,今天我们来看最后一种与工厂相关的模式,抽象工厂模式. 抽象工厂模式算是工厂相关模式的终极形态,如果各位完全理解了上一章的工厂方法模式,那么抽象工厂模式就很好理解了.它与工厂方法唯一的区别就是工厂的接口里是一系列创造抽象产品的方法,而不再是一个,而相应的,抽象产品也不再是一个了,而是一系列相关的产品.这其实是工厂方法模式的一种扩展不是吗? 通常意义来我

php设计模式——抽象工厂模式(Abstract Factory)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 <?php 2 /* 3 * php设计模式——抽象工厂模式(Abstract Factory) 4 */ 5 6 7 /* 8 * I

浅谈 js 字符串 search 方法

原文:浅谈 js 字符串 search 方法 这是一个很久以前的事情了,好像是安心兄弟在学习js的时候做的练习.具体记不清了,今天就来简单分析下 search 究竟是什么用的. 从字面意思理解,一个是搜索字符串吧. var str = "123456789abcde"; console.log( str.search("abc") ); // 9 确实是搜索指定字符在一个字符串中出现的位置,如果不存在就返回 -1可是这样就跟 indexOf 功能一样了,何必单独搞一