当前位置: 首页 > Web前端 > HTML

工厂模式

时间:2023-03-28 00:02:54 HTML

简单工厂模式定义:在简单工厂模式中,可以根据不同的参数返回不同类的实例。简单工厂模式专门定义一个类负责创建其他类的实例,创建的实例通常有一个共同的父类。看了很多关于简单工厂的文档,还是没有解开我的疑惑(constructor是不是简单工厂???)所以,我也会在后面的文档中把constructor放在简单工厂里面(如果我的理解有误,希望海涵)//因为在我的认知中,构造函数和后面的方法唯一的区别就是是否可以找到创建这个对象的方法(错误)//公司架构师解释说工厂模式不应包含初始原型,因此构造函数是错误的。//Constructor/*functionSingleFactory(name){this.name=name}*///简单工厂//传入参数并创建对应实例functionsingleFactory(name){returnnewObject({name})}constsfp=newSingleFactory('kitten')constsf=singleFactory('doggy')console.log(sfp)//SingleFactory{name:'kitten'}console.log(sf)//{name:'doggy''}工厂方法模式定义:在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类负责生成具体的产品对象。这样做的目的是为了延迟产品类的实例化,直到它在工厂子类中完成,即具体应该实例化的产品类是通过工厂子类来确定的。在工厂方法中,我们只需要维护工厂方法的属性来实现不同的类functionAnimals(name){returnnewthis[name]()}Animals.prototype={Cat:function(){this.animals=['橘猫','果子狸']},Dog:function(){this.animals=['中华田园犬','猛藏獒']},}vardog=newAnimals('Dog')varcat=newAnimals('Cat')console.log(dog)//Dog{animals:Array(2)}console.log(cat)//Cat{animals:Array(2)}当然据我了解,我们不仅要支持new构造函数的编写,还要支持函数调用的形式,调整上面的代码。functionAnimals(name){if(thisinstanceofAnimals){returnnewthis[name]()}else{returnnewAnimals(name)}}Animals.prototype={Cat:function(){this.animals=['橙色Cat','灵猫']},Dog:function(){this.animals=['中华田园犬','猛藏獒']},}vardog=newAnimals('Dog')varcat=Animals('Cat')console.log(dog)//Dog{animals:Array(2)}console.log(cat)//Cat{animals:Array(2)}这样我们支持new构造一个对象or直接调用构造对象的函数抽象工厂模式定义:抽象工厂模式是指当存在多个抽象角色时使用的一种工厂模式。抽象工厂模式可以为客户端提供一个接口,使得客户端可以在多个产品系列中创建产品对象,而无需指定产品的具体情况functionAnimals(subType,superType){if(typeofAnimals[superType]==='function'){//这里其实有一个知识点,构造函数的几种继承方式,这里使用了最合理的寄生继承组合,当然本文不会详细讲解继承方式//用来继承父类容器varF=function(){}//F函数的原型指向Animals子类的实例F.prototype=newAnimals[superType]()//subType子类的构造函数指向自身subType.constructor=subType//subType子类的原型指向父类subType.prototype=newF()}else{thrownewError('Animals没有这个抽象类')}}Animals.Cat=function(){this.type='kitten'}Animals.Cat.prototype={execVoice:function(){returnnewError('Thismethodneedstobeoverridden')},}Animals.Dog=function(){this.type='小狗'}Animals.Dog。prototype={execVoice:function(){returnnewError('这个方法需要被覆盖')},}functionDog(name,voice){this.name=namethis.voice=voice}functionCat(name,voice){this.name=namethis.voice=voice}Animals(Dog,'Dog')Animals(Cat,'Cat')Dog.prototype.execVoice=function(){返回rnthis.voice}Cat.prototype.execVoice=function(){returnthis.voice}vardog=newDog('旺财','Wow,woof')varcat=newCat('乡愁','喵喵喵')console.log(dog,dog.execVoice())//狗'哇'console.log(cat,cat.execVoice())//猫'喵喵'