Java开发篇——设计模式面试被问工厂模式?不要怕看这里!
Posted weixin_43802541
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java开发篇——设计模式面试被问工厂模式?不要怕看这里!相关的知识,希望对你有一定的参考价值。
上一篇中我们分析并实现了面试中经常提到的单例设计模式的各种实现方式,面试中被问到单例基本上就可以搞定了,那么如果在面试被问到23种经典设计模式的“工厂模式”又该如何回答呢?
作为面试官以及见证过很多候选者经常会问下“介绍下你最熟悉的设计模式”的时候,大部分人都会回答说单例和工厂,然后他们就介绍单例和工厂的基本实现。说到工厂模式的时候要不说的是简单工厂的实现,要不就是举例说我们开发中很多框架用了比如连接mysql使用工厂创建多个连接等例子。
这种网上一搜一大把的例子,你有想过面试官一天到晚都是听到相同回答的感受吗?
如果进一步问详细一点,“你说一下简单工厂、工厂方法和抽象工厂的实现和优缺点”很多初级面试者都会蒙圈,因为很多人只是知道很多地方使用了工厂模式但是压根不知道是怎么实现的,也不知道人家为什么这么用。
下面我就来跟大家讲讲工厂模式。
1.什么是工厂模式?
工厂模式(Factory Pattern)是开发中常用的设计模式之一,属于创建型设计模式;跟单例设计模式创建单一实例不同的是,工厂模式是提供创建对象的最佳方式帮助我们按照不同的需求创建产品以达到“需求”和“生产产品”的解耦。并且工厂模式在创建对象时也不会对外暴露创建对象的过程,并且可以使用同一个共同的接口访问创建对象。
工厂模式的实现主要分为三种:
简单工厂模式(Simple Factory);
工厂方法模式(Factory Method);
抽象工厂模式(Abastract Factory );
其中简单工厂不在23种经典设计模式里;这三种模式从简单到抽象,设计过程越来越复杂,但是设计上越来越完美。工厂模式在软件应用中非常的常见著名的Jive论坛,就大量使用了工厂模式;java的很多开源框架中也大都使用了工厂模式,例如Spring框架就使用BeanFactroy创建的bean。
下面分别介绍一下这三种实现。
2.简单工厂模式
简单工厂模式也被称为静态工厂模式,就是建立一个工厂类,对实现了同一接口的一些产品类通过工厂类的静态方法进行实例的创建。
下面我们看下简单工厂的实现:
分析:简单工厂按照我们传入phoneType类型的需要生产对于的手机对象,实现了需求和产品的一定程度上的解耦。缺点是如果我们传递phoneType出错则不能正确创建手机对象,并且想要增加一个新的手机类对象Samsung,那么就需要手动去修改PhoneFactory 里面的代码,以后每次增加我们都需要维护工程的makePhone方法就非常的麻烦。主要原因是因为我们产品和工厂并没有解耦所导致的,那如何解决这个问题呢? 就是工厂方法模式了。
3.工厂方法模式
和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂,每一个具体产品工厂分别负责创建产品对象。工厂方法模式设计的时候产品相关的类定义不变,添加具体的产品工厂就行,如下:
分析:
工厂方法的好处是解决了简单工厂的“产品”和“工厂”未解耦问题,实现了一个工厂生产一个产品的模式这样即使增加新产品添加新的工厂就行。
但是工厂方法模式不管工厂怎么拆分抽象,都只是针对一类产品Phone(AbstractProduct),如果想要生产其他类型的产品呢,比如:notebook笔记本;简单点就是直接把生成Phone的这套代码复制一份修改下,,显然这样并不利于扩展和维护。如何解决?就用到抽象工厂模式。
4.抽象工厂模式
抽象工厂模式相对于工厂方法模式来说,就是工厂方法模式是针对一个产品系列的,而抽象工厂模式是针对多个产品系列的,即工厂方法模式是一个产品系列一个工厂类,而抽象工厂模式是多个产品系列一个工厂类。在抽象工厂模式中,客户端不再负责对象的创建,而是把这个责任丢给了具体的工厂类,客户端只负责对对象的调用,从而明确了各个类的职责。代码实现如下:
分析:
我们可以看到在抽象工厂中,同一个等级的产品是派生于一个抽象产品,一个抽象工厂派生不同的具体工厂,每个具体工厂生产自己的产品族(可以是不同类型的产品)。
理解了上面三种工厂模式之后,在面试的时候就可以昂头挺胸自信的回答了。不过在面试官问到“什么时候用到工厂模式或者项目中哪些地方使用了工厂模式”,我们就不要只是回答框架中大量使用了工厂模式、数据库连接的时候使用了之类的,也要结合到自己项目中去说,比如:我做的一个电商网站分为pc端、mobile端、h5端等,根据不同端的请求影响不同的页面我们就使用了工厂模式等等。
以上是关于Java开发篇——设计模式面试被问工厂模式?不要怕看这里!的主要内容,如果未能解决你的问题,请参考以下文章