`

设计模式大集锦 程序员面试全攻略

 
阅读更多

无论你是参与Java面试还是C#面试,设计模式和软件设计问题在程序员面试中是必不可少的一部分。编程和设计技两者相得益彰,一名出色的程序员也是一名出色的设计师,他们懂得如何利用代码来解决问题或者软件设计,但是这些技能需要不断提升。这就要求你不断的保持设计理念,无论编程项目的大小,从失败中总结经验。

从面向对象的设计原则开始学习是个不错的起点。本文总结了在各种面试过程中经常被提及的一些设计问题。文中分为两部分,一类为初学者,另一类专为中高级技术人员准备。

一、入门级程序员的面试题:

这些软件设计和设计模式的先关问题大多会出现在初学者面试情景中,什么是设计模式?特定的设计模式又是什么?等等这些概念,也许你很轻易回答这些概念,但文内提供的这些问题也许能给你带来更多价值。

1. 什么是设计模式?在你编码过程中使用了哪些设计模式?

每位程序员都会利用自身经历来回答这些特定的设计问题。设计模式是代码重用的扩展。

2. 你能说出在标准的JDK库中使用的一些设计模式吗?

Decorator设计模式常被用于各种Java IO类中,Singleton模式常被用在运行环节中,Calendar以及各种其他类,Factory(工厂)模式常被用于各种不可变类,比如Boolean。Boolean.valueOf和Observer模式常被用于Swing和许多事件监听器框架中。

3. 在Java中Singleton设计模式是什么?为线程安全Singleton编码。

Singleton模式在整个系统中主要是共享模式。在整个应用程序实例中只保持一个特定的类,这是由所以模块共享决定的。Java.lang.Runtime是Singleton设计模式中一个典型范例。关于此问题你可以查看更多。从Java 5版本开始,你可以为安全线程singleton模式使用enum

4. 使用Factory模式主要优势是什么?你会在哪种情况下使用?

Factory模式最主要的优势在于当创建对象时可提高封装水平。如果你使用Factory模式来创建对象,你可以在后期重置最初产品的装置或者无须任何客户层就可实现更先进更高性能的类。可以查看我曾发表过的有关Factory模式的更多细节及优点。

5. Java中Observer设计模式是什么?

Observer设计模式基于对象的变化而改变。比如:天气系统,在这里必须将天气变化的视图呈现给观众。这里天气项目是主体而非不同的观察者。通过这篇文章,查看在Java中Observer模式。

6. 例举一个在Java中使用Decorator模式的案例?它从事的是对象级别还是类级别?

Decorator模式可提高个体对象的能力。Java IO广泛使用Decorator模式和Buffered类型的一些经典例子,比如BufferedReader和BufferedWriter,增强读者和作家执行Buffer级别的阅读和写作从而提高性能。了解更多

7. 什么是MVC设计模式?请例举一个MVC设计模式案例。

8. Java中FrontController设计模式是什么?请例举一个FrontController设计模式案例。

9. Responsibility设计模式是什么?

10. Adapter设计模式是什么?请例举一个在Java中的Adapter设计模式案例。

二、进阶级程序员的面试题:

1. 举例说明你什么时候会用抽象类,什么时候更愿意使用接口?

这是一个很常见的面试问题,并不算难。接口和抽象类都按照“不为实现写代码”的设计原则,这是为了增加代码的灵活性,以应付不断变化的要求。下面是一些帮助你回答这个问题的指南:

  • 在Java中,你只能继承一个类,但实现多个接口。所以你继承一个类的时候就无法再继承别的类了。
  • 接口是用来代表形容词或行为,例如Runnable、Clonable、Serializable等。因此,如果您使用一个抽象类来实现Runnable和Clonacle,你就不可以使你的类同时实现这两个功能,而如果接口的话就没问题。
  • 抽象类是比接口稍快,所以很在乎时间的应用尽量使用抽象类。
  • 如果多个继承层次的共同行为在在同一个地方编写更好,那么抽象类会是更好的选择。有时候可以在接口里定义函数但是在抽象类里默认功能就能实现接口和抽象类共同工作了。了解Java接口

2. 设计一个能接收不同硬币、出售不同货物的自动售货机。

这是一个比较开放的设计问题,你可以使用它练习文档设计、写代码和JUnit单元测试,而不是仅仅是解决问题。这道题的目标绝不会仅仅是想测出你多久能够得到解决方案。理想情况下,这个问题应该在3小时内给出一个可工作版本。

3. 你有一个Smartphone类和它派生类iPhone、 AndroidPhone、WindowsPhone等,以及以品牌名称命名的派生类如SonyPhone等。你该如何设计这一类的系统?

这是另一种设计模式的练习,你充分利用面向对象的设计技巧,保证它有足够的灵活性来支持新产品,并且在现有模型改变时能够保证足够的稳定性。

4. 在Java中,什么时候该使用overload,什么时候使用override?

对于一个经验丰富的设计师来说这是一个非常简单的问题。重载和覆盖在Java里实现的都是同一个功能,但overload的输入变量不同,override则完全相同。

5. 设计ATM机

我们几乎都使用过ATM机,但你想过该怎么设计它吗?金融系统的设计原则之一就是必须能在所有预期情况下都能够正常运行。所以无论是发生断电还是什么其它暴力问题,ATM机都必须能够保证正确的状态。 考虑下锁、事务处理、错误状态、临界条件等等。即使你拿不定确切的设计方案,但是能够指出非功能性需求、提出一些问题或者考虑考虑临界条件都会对你有帮助。

6. 假设你正在设计市场数据类来保证能够切换不同的信息供应商,比如Reuters、wombat等等,或者直接交换信息,你该如何设计这个市场信息系统?

这是非常有趣的设计面试问题,实际上在大型投资银行里是个很普遍的问题。关键在于你需要提供拥有getBid()、getPrice()和getLevel()方法的MarketData接口供客户请求,同时还需要有一个使用依赖注入的MarketDataProvider组件。这样在你改变MarketDataProvider时就不会对系统产生影响,因为客户是通过MarketData接口或者类调用方法的。

7. 为什么Java里不允许从静态方法中获取非静态变量?

Java里不允许从静态方法中获取非静态变量仅仅是因为非静态变量会和特定的对象实例相关联,而静态变量不会。你也可以看看这篇文章的详细解释。

8. 用Java设计一个并发规则管道?

并发编程和并行设计非常热门,因为它能更高效地利用现在越来越先进的处理器,而且Java被认为是多线程语言也主要因为此原因。设计一个并发系统的关键在于线程安全、不可变性、本地变量,还有避免使用局部变量和实例变量。你只需要保证多个线程能够在同一时间执行同一个类,所以最佳解决方案就是每个线程只操作自己的数据,尽量使用最小的同步,尤其是在管道开始时。这个问题可以从初始讨论到最终类和接口的编写实现,但是只要你记得注意并发问题的关键,比如竞争状态死锁、内存冲突、原子操作、ThreadLocal变量等等,尽量绕过这些问题。

以上这些设计模式经常出现在面试环节中,比如Google,Amazon, Microsoft等。如果您在面试过程中遇到了一些有趣的话题,不妨与我们分享下。

 

 

 

分享到:
评论

相关推荐

    设计模式大集锦程序员面试全攻略

    无论你是参与Java面试还是C#面试,设计模式和软件设计问题在程序员面试中是必不可少的一部分。编程和设计技两者相得益彰,一名出色的程序员也是一名出色的设计师,他们懂得如何利用代码来解决问题或者软件设计,但是...

    程序员面试整理打包分享之程序员面试part2

    75道逻辑思考题 500强企业面试智力 java 程序员面试题经典集锦 程序员面试逻辑思维题 逻辑思维题训练 附答案 由数十家知名IT企业综合题 外企面试必备 逻辑题 程序员面试(Java Net 阿里等名企) 一共只收2分 因为...

    程序员面试整理打包分享之程序员面试part3

    75道逻辑思考题 500强企业面试智力 java 程序员面试题经典集锦 程序员面试逻辑思维题 逻辑思维题训练 附答案 由数十家知名IT企业综合题 外企面试必备 逻辑题 程序员面试(Java Net 阿里等名企) 一共只收2分 因为...

    程序员面试整理打包分享之程序员面试part1

    75道逻辑思考题 500强企业面试智力 java 程序员面试题经典集锦 程序员面试逻辑思维题 逻辑思维题训练 附答案 由数十家知名IT企业综合题 外企面试必备 逻辑题 程序员面试(Java Net 阿里等名企) 一共只收2分 因为...

    程序员 面试 宝典 各大公司面试集锦

    《程序员面试宝典:各大IT公司历年面试真题》是一本专门为准备进入IT行业的程序员们量身打造的面试指南。这本书汇聚了微软、华为等知名企业的面试题目,旨在帮助求职者提升自己的技术水平,增强面试自信心,从而在...

    程序员面试题集锦

    【程序员面试题集锦】是针对IT行业,尤其是Java编程方向的面试者精心整理的一份资源,涵盖了各大公司的面试题目以及数据结构相关的知识点。这份资料旨在帮助应聘者全面准备面试,提升自己的技术水平和应试能力。 一...

    JAVA程序员 面试 java面试资料集锦 经验 面试常问的问题 面试无忧

    这份"JAVA程序员面试 java面试资料集锦 经验 面试常问的问题 面试无忧"的资源旨在帮助你充分准备,提升面试成功的概率。 首先,Java面试通常会围绕以下几个核心领域展开: 1. **基础知识**:面试官会检查你对Java...

    非常详细的程序员面试题集锦

    这篇文档集合了程序员面试的核心知识点,旨在帮助求职者在面对各种技术面试时能有更全面的准备。以下是对这些文件内容的概要和解析: 1. **测试Testframework.doc**: 这份文档可能涵盖了测试框架的相关知识,如...

    JAVA程序员面试集锦(PDF)

    可能涉及Java设计模式、JVM内存模型、数据结构与算法、数据库操作、项目经验等,旨在帮助求职者在面试中表现出色。 3. **JAVA面试题集.pdf**:这可能是另一份全面的Java面试题集合,可能包括了从基础到高级的各种...

    java程序员面试集锦

    最后,面试中还可能涉及设计模式,如单例模式、工厂模式、观察者模式等,这些都是软件设计中常用的最佳实践。 在准备面试时,除了理论知识,实践项目经验、问题解决能力和团队协作能力同样重要。熟悉上述知识点,并...

    程序员面试介绍 电子书

    “程序员面试宝典.CHM”作为电子书形式,可能包含详尽的面试指南、实例解析、常见问题集锦,以及一些实战演练,旨在帮助程序员在面试中展现出最佳状态,提升竞争力。在阅读这本书时,建议结合实践,不断巩固和提高...

    Java程序员面试题集锦-java程序员面试试题与解析doc精品模板.docx

    【Java程序员面试题集锦】 Java程序员面试题不断演变,早期简单的问题如String和StringBuilder的区别已不足以满足现代面试的要求。面试官现在倾向于提出更高级、更深入的问题,以全面评估候选人的技能和经验。 1) ...

    设计模式部分习题集锦,程序员必看设计模式

    - **结构型设计模式**:这类模式关注于如何将类或对象组合成更大的结构。 - **适配器模式**:将一个类的接口转换成客户希望的另一个接口。 - **桥接模式**:将抽象部分与它的实现部分分离,使它们都可以独立变化。...

    java程序员面试题经典集锦

    Java程序员面试题经典集锦包含了广泛的Java技术领域,旨在帮助面试者全面准备可能出现的各种问题。以下将详细讨论其中的关键知识点: 1. **Java基础方面**: - **访问修饰符的作用域**: - `public`:任何地方都...

    IT程序员面试笔试集锦.7z

    《IT程序员面试笔试集锦》是一个综合性的资源包,包含了大量关于IT程序员面试和笔试的资料,旨在帮助求职者充分准备,提升成功通过面试和笔试的可能性。这个压缩包中的内容可能涵盖了许多重要的知识点,包括但不限于...

    java_程序员面试题经典集锦(精编)

    Java程序员面试题经典集锦包含了广泛的Java技术和概念,这些知识点是面试中经常被问到的。以下是根据标题、描述和标签以及部分内容所涵盖的主题进行的详细解析: 1. **Java基础方面** - **访问修饰符**:Java的...

    程序员面试宝典(C/C++/操作系统...)

    《程序员面试宝典》是一本面向准备面试的程序员的重要参考资料,涵盖了C/C++语言和操作系统等多个关键领域的知识。这本书以其清晰的阐述和丰富的面试问题集锦而受到读者的青睐,尽管书中存在一些作者的错误,但总体...

    《程序员面试宝典》集锦

    《程序员面试宝典》集锦中包含了多个重要的知识点,主要围绕着C语言编程和面试准备相关的技术细节。 首先,文档中提到了C语言中printf函数的参数计算顺序。在C语言中,printf函数使用参数时,参数压栈是从右到左的...

Global site tag (gtag.js) - Google Analytics