`
laosi0829
  • 浏览: 1353 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

设计模式大集锦

 
阅读更多
设计模式大集锦 程序员面试全攻略
发表于2012-06-04 17:41| 31594次阅读| 来源CSDN编译| 23 条评论| 作者夏梦竹、王然
单元测试windowsphone设计模式面试程序员
摘要:无论你是参与Java面试还是C#面试,设计模式和软件设计问题在程序员面试中是必不可少的一部分。编程和设计技两者相得益彰,一名出色的程序员也是一名出色的设计师,他们懂得如何利用代码来解决问题或者软件设计,但是这些技能需要不断提升。这就要求你不断的保持设计理念,无论编程项目的大小,...

无论你是参与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等。如果您在面试过程中遇到了一些有趣的话题,不妨与我们分享下。

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

本文为CSDN编译整理,未经允许不得转载。如需转载请联系market@csdn.net。
分享到:
评论

相关推荐

    软件设计模式大作业

    软件设计模式大作业 本资源为一份完整的软件设计模式大作业,涵盖了六种设计模式的应用,分别是简单工厂模式、工厂方法模式、单例模式、门面模式、策略模式和观察者模式。该大作业的主要内容包括系统流程、系统类图...

    设计模式大作业.zip

    在“设计模式大作业.zip”这个压缩包中,我们看到了一系列使用了多种设计模式实现的代码示例,这包括简单工厂模式、工厂方法模式、单例模式、门面模式以及策略模式。接下来,我们将深入探讨这些设计模式及其在实际...

    基于Java的设计模式大作业绘图系统【六种设计模式+文档】.zip

    本系统基于六种设计模式,运用到的设计模式有备忘录模式,简单工厂模式,迭代器模式,状态模式,模版方法模式,单例模式。 具体实现过程、UML类图以及实现效果详见如下项目说明地址: ... 该系统为绘图系统,该系统通过...

    设计模式(包含5个设计模式)含源代码报告.rar

    这个压缩包文件"设计模式(包含5个设计模式)含源代码报告.rar"显然是一份宝贵的资源,它涵盖了五个核心的设计模式,并附带了详细的类图、源代码以及文档报告,这对于学习和理解设计模式至关重要。 首先,我们要探讨...

    设计模式期末大作业 ToFu

    在本项目“设计模式期末大作业 ToFu”中,开发者运用了多种设计模式来构建一个豆腐商店的应用。这个应用展示了如何在实际编程中灵活运用设计模式来提高代码的可读性、可维护性和可扩展性。以下是每个设计模式的详细...

    人人都懂设计模式 人人都懂设计模式

    设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。 在本书中,作者罗伟富通过 Python 实现了 23 种经典设计模式,包括 Singleton 模式、Factory 模式、Observer 模式等。这些模式可以帮助开发者更好地...

    Head First 设计模式 +Java设计模式(第2版)

    《Head First 设计模式》与《Java设计模式(第2版)》是两本非常重要的IT书籍,专注于软件开发中的设计模式。设计模式是解决软件设计中常见问题的经验总结,它们提供了一种标准的方法来处理特定场景下的问题,使得代码...

    设计模式大作业(含源代码+PPT+报告)

    本科阶段写过一个小游戏,是一门课的大作业,当时能力有限,代码能力以及对设计模式的理解和运用都不够,后来研究生期间,由于《软件结构设计与模式分析》这门课的期末考试需要我们编写并分析一个软件,软件类型不限...

    GOF设计模式中英文+设计模式精解中英文

    设计模式分为三大类:创建型模式、结构型模式和行为型模式。创建型模式关注对象的创建过程,如单例模式、工厂模式、建造者模式等;结构型模式关注如何组合对象和类以构建更复杂的设计,如适配器模式、装饰器模式、...

    设计模式大作业动物运动会系统【多种设计模式+文档】.zip

    本系统并非31个单个系统,而是一整个大的系统中包含了31种设计模式。 系统设计过程、设计模式介绍、UML类图以及系统实现效果详见如下项目说明: ...项目简介:《动物运动会》是一套动物运动会题材的体验类动物运动会 ...

    23种设计模式详解PDF

    总体来说设计模式分为三大类: 创建型模式(5): 工厂方法模式 、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式(7): 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式...

    设计模式之蝉

    书中包含了作者的个人读书笔记,这表明除了正文内容之外,作者还提供了自己的理解与见解,这些笔记可能对理解设计模式的精髓与实际应用有很大的帮助。 在内容部分,我们可以看到有关于设计模式的一些具体讨论,例如...

    软件设计模式期末作业

    在软件开发领域,设计模式是经过时间和实践验证的解决方案模板,用于解决常见问题。本作业以“软件设计模式”为主题,特别关注了装饰模式、工厂模式和适配器模式的运用。这三种模式都是面向对象设计的核心部分,它们...

    python设计模式第2版.pdf

    设计模式是构建大型软件系统zui强大的方法之一,优化软件架构和设计已经逐渐成为软件开发和维护过程中的一个重要课题。 Python设计模式(第2版)通过11章内容,全面揭示有关设计模式的内容,并结合Python语言进行示例...

    设计模式大作业游戏

    这是本人研究生期间完成的一次设计模式大作业,有关于设计模式的课程结课作业,设计模式总共23种,在这里我运用了6种设计模式设计了一款游戏,运用了c#编程语言,压缩包中含有项目的说明书,PPT,完整的源码,还有...

    设计模式课件大全

    设计模式10-代理模式、结构型模式大复习 设计模式11-行为模式-责任链、命令模式 设计模式12-解释器模式 设计模式13-迭代器模式 设计模式14-中介者模式、备忘录模式 设计模式15-观察者模式、状态模式 设计模式16-策略...

    新版设计模式手册 - C#设计模式(第二版)

    设计模式分为三大类:创建型模式、结构型模式和行为型模式。 1. 创建型模式:这类模式涉及到对象的创建,如单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。例如,单例模式确保一个类只有一个实例,...

    软件设计模式(java版)习题答案.pdf

    软件设计模式(Java版)习题答案 本资源为软件设计模式(Java版)习题答案,由程细柱编著,人民邮电出版社出版。该资源涵盖了软件设计模式的基础知识,包括软件设计模式的概述、UML中的类图、面向对象的设计原则、...

    设计模式 四人帮设计模式

    设计模式 四人帮设计模式。比较经典的设计模式。

Global site tag (gtag.js) - Google Analytics