当前位置: 首页 > 科技观察

面试官:说说你对工厂模式的理解?应用场景?

时间:2023-03-19 00:19:18 科技观察

1。什么是工厂模式?它是创建对象最常用的设计模式。它没有暴露对象创建的具体逻辑,而是把逻辑封装在一个函数中,那么这个函数就可以看成是一个工厂,就像一个重复生产类似产品的工厂。工厂模式只需要我们传入正确的参数就可以生产出类似的产品。例如:在编程中,通过newB类实例化了一个A类,那么A类和B类之间就产生了关联(耦合)。后来因为需要修改B类的代码和用法,比如传递参数在构造函数中,ClassA也必须做相应的修改。一个类的依赖可能不会有太大的影响,但是如果有多个类依赖B类,工作量会相当大,容易出现修改错误,还会产生很多重复的代码,这无疑是一件很痛苦的事;在这种情况下,需要将创建实例的工作与调用者(A类)分离,与调用者“解耦”,即封装使用工厂方法创建实例的工作(“减少代码duplication)),并由工厂管理对象的创建逻辑,调用者无需知道具体的创建过程,直接使用即可,“并减少调用者创建逻辑带来的错误”;二、工厂模式的实现按照抽象程度可以分为以下几种:简单工厂模式(SimpleFactory)工厂方法模式(FactoryMethod)抽象工厂模式(AbstractFactory)简单工厂模式简单工厂模式也是称为StaticFactoryMode,使用一个工厂对象创建同一个类对象类的实例假设我们要开发一个公司职位及其工作内容输入信息,不同职位的工作内容不一致代码如下:functionFactory(career){functionUser(career,work){this.career=careerthis.work=work}letworkswitch(career){case'coder':work=['writeCode','FixBug']returnnewUser(career,work)breakcase'hr':work=['recruitment','员工信息管理']returnnewUser(career,work)breakcase'driver':work=['driving']returnnewUser(career,work)breakcase'boss':work=['喝茶','开会','审批文件']returnewUser(career,work)break}}letcoder=newFactory('coder')console.log(coder)letboss=newFactory('boss')console.log(boss)Factory是一个简单的工厂我们在调用工厂函数时,只需要传入姓名、年龄、职业,就可以得到包含用户工作内容的实例对象。工厂方法模式类似于简单工厂模式,只是将具体的产品放在工厂函数的原型中。这样扩展产品类别就不需要修改工厂函数了,就变成了一个抽象类。也可以随时改写特定产品,相当于工厂本部不生产该产品,交给分厂生产;但是在进入工厂之前,你需要一个判断,验证你要生产的东西是否属于我们工厂生产的范围。如果有,就丢给下属工厂生产。如下代码://factorymethodfunctionFactory(career){if(thisinstanceofFactory){vara=newthis[career]();returna;}else{returnnewFactory(career);}}//设置原型中所有对象的构造函数工厂方法函数Factory.prototype={'coder':function(){this.careerName='Programmer'this.work=['WriteCode','FixBug']},'hr':function(){this.careerName='HR'this.work=['招聘','员工信息管理']},'driver':function(){this.careerName='driver'this.work=['driving']},'boss':function(){this.careerName='boss'this.work=['喝茶','开会','审批文件']}}letcoder=newFactory('coder')console.log(coder)lethr=newFactory('hr')console.log(hr)factorymethod关键核心代码是判断这个是否属于工厂中的工厂,也就是进行分支判断。这个工厂只做我能做的产品。不同的是,抽象工厂模式并不直接生成实例,而是用来创建产品集群。通俗地说:简单工厂和工厂方法模式的工作是生产产品,所以抽象工厂模式的工作是生产工厂的原因JavaScript中没有抽象类的概念,只能模拟,而可以分为四个部分:用于创建抽象类的函数抽象类具体Class实例化一个具体的类在上面的例子中,有四个职位:coder、hr、boss、driver。其中,coder可能会使用不同的开发语言进行开发,比如JavaScript、Java等。那么这两种语言对应的类簇示例代码如下:letCareerAbstractFactory=function(subType,superType){//判断抽象类是否存在于抽象工厂中if(typeofCareerAbstractFactory[superType]==='function'){//CacheclassfunctionF(){}//继承父类的属性和方法F.prototype=newCareerAbstractFactory[superType]()//将子类的构造函数指向父类subType.constructor=subType;//子类原型继承父类subType.prototype=newF()}else{thrownewError('抽象类不存在')}}上面代码中,CareerAbstractFactory是一个抽象工厂方法,传递子类和父类在参数中,并在方法体内部实现子类继承父类3.应用场景从上面可以看出,简单简单的工厂的好处就是我们只要通过ss正确的参数,我们不需要关心它创建的具体细节。应用场景也容易识别,有构造函数的地方,可以考虑简单工厂,但是如果构造函数太多太复杂,工厂函数就会变得复杂,不适合复杂的情况。抽象工厂模式一般用于严格的要求和面向对象的思想。在超大型项目的开发中,一般开发中我们一般使用较多的是简单工厂和工厂方法模式。综上所述,工厂模式的适用场景如下:如果你想在运行时从众多子系统中进行选择,那么工厂模式是一个理想的选择,可以简单地封装新的操作。遇到new,要考虑是否使用工厂模式;它取决于特定的环境创建不同的实例,而这些实例具有相同的行为。这时候,我们可以使用工厂模式来简化实现过程。同时也可以减少每个对象所需的代码量,有利于消除对象之间的耦合,提供更大的灵活性参考https://www.runoob.com/design-pattern/factory-pattern。htmlhttps://juejin.cn/post/6844903653774458888https://zhuanlan.zhihu.com/p/344119981