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

  • 格式:docx
  • 大小:24.21 KB
  • 文档页数:5

摘要:无论你是参与Java面试还是C#面试,设计模式和软件设计问题在程序员面

试中是必不可少的一部分。编程和设计技两者相得益彰,一名出色的程序员也是

一名出色的设计师,他们懂得如何利用代码来解决问题或者软件设计,但是这些

技能需要不断提升。这就要求你不断的保持设计理念,无论编程项目的大

小,...

无论你是参与Java面试还是C#面试,设计模式和软件设计问题在程序员面试中是

必不可少的一部分。编程和设计技两者相得益彰,一名出色的程序员也是一名出

色的设计师,他们懂得如何利用代码来解决问题或者软件设计,但是这些技能需

要不断提升。这就要求你不断的保持设计理念,无论编程项目的大小,从失败中

总结经验。

从面向对象的设计原则开始学习是个不错的起点。本文总结了在各种面试过程中

经常被提及的一些设计问题。文中分为两部分,一类为初学者,另一类专为中高

级技术人员准备。

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

这些软件设计和设计模式的先关问题大多会出现在初学者面试情景中,什么是设

计模式?特定的设计模式又是什么?等等这些概念,也许你很轻易回答这些概念

,但文内提供的这些问题也许能给你带来更多价值。

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

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

的扩展。

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

Decorator设计模式常被用于各种Java IO类中,Singleton模式常被用在运行环

节中,Calendar以及各种其他类,Factory(工厂)模式常被用于各种不可变类

,比如Boolean。Boolean.valueOf和Observer模式常被用于Swing和许多事件监

听器框架中。

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

Singleton模式在整个系统中主要是共享模式。在整个应用程序实例中只保持一

个特定的类,这是由所以模块共享决定的。ng.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等

。如果您在面试过程中遇到了一些有趣的话题,不妨与我们分享下。

英文出自:javarevisited(文中部分链接无法直接打开)

转自csdn