不管你是参与Java面试仍是C#面试,设计模式和软件设计问题在程序员面试中是必不可少的一部分。编程和设计技二者相得益彰,一名出色的程序员也是一名出色的设计师,他们懂得如何利用代码来解决问题或者软件设计,可是这些技能须要不断提高。这就要求你不断的保持设计理念,不管编程项目的大小,从失败中总结经验。html
从面向对象的设计原则开始学习是个不错的起点。本文总结了在各类面试过程当中常常被说起的一些设计问题。文中分为两部分,一类为初学者,另外一类专为中高级技术人员准备。java
1、入门级程序员的面试题:程序员
这些软件设计和设计模式的先关问题大多会出如今初学者面试情景中,什么是设计模式?特定的设计模式又是什么?等等这些概念,也许你很轻易回答这些概念,但文内提供的这些问题也许能给你带来更多价值。面试
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设计模式案例。
2、进阶级程序员的面试题:
1. 举例说明你何时会用抽象类,何时更愿意使用接口?
这是一个很常见的面试问题,并不算难。接口和抽象类都按照“不为实现写代码”的设计原则,这是为了增长代码的灵活性,以应付不断变化的要求。下面是一些帮助你回答这个问题的指南:
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(文中部分连接没法直接打开)