设计模式与实时示例

时间:2012-07-19 04:08:50

标签: design-patterns

我想通过实时示例学习设计模式。那么任何人都可以建议我可以从哪里开始。

4 个答案:

答案 0 :(得分:18)

注意:使用现实生活和Java API示例添加简要定义。

创建型

  

您想如何创建对象?

原型:要复制或克隆的完全初始化的实例 示例:国际象棋比赛的初始状态

  • java.lang.Object#clone()

构建器 - 将复杂对象的构造与其表示分开,以便相同的构造过程可以创建不同的表示
示例:厨房是工厂,厨师是生成器,服务员告诉厨师"披萨配奶酪,洋葱和#34;。这里厨师暴露属性但隐藏实现。

  • java.lang.StringBuilder中

Singleton - 只有一个实例可以存在的类
示例:一个国家的总统

  • java.lang.Runtime中#getRuntime()

工厂方法 - 创建多个派生类的实例 示例:在组织中,HR用作工厂方法。这里开发团队要求HR需要资源类型。根据请求类型,HR为开发团队提供资源。

  • 的java.util.Calendar#的getInstance()

抽象工厂 - 创建几个类族的实例  示例:HP,Samsung和Dell笔记本电脑均采用Intel和AMD处理器。

  • javax.xml.parsers.DocumentBuilderFactory #newInstance()

Factory Method vs Abstract Factory

结构

  

这种设计模式是关于类和对象的组合,即如何构建软件组件。

代理 - 表示另一个对象的对象
示例:支票簿,信用卡,借记卡是Money的代理商,客户代表可以订购产品。

  • java.rmi。*,实际上是整个API。

复合 - 为叶子和复合提供统一的界面 示例:操作系统中的文件系统,目录是复合的,文件是离开的。系统调用Open是复合和叶子的单一界面。

装饰器 - 为leaf提供附加功能,同时提供统一界面 示例:1)在订单上添加折扣2)枪支是它自己的致命武器。但你可以申请某些装饰品#34;使它更准确,沉默和毁灭性。

  • java.io.InputStream,OutputStream,Reader和的所有子类 Writer有一个构造函数来获取相同类型的实例。

Facade - 使用单一界面简化多个复杂组件 示例:控制面板

  • javax.faces.context.ExternalContext,内部使用 ServletContext,HttpSession,HttpServletRequest,HttpServletResponse, 等

适配器 - 为界面提供不同的界面 示例:电源适配器

  • java.util.Arrays中#asList()

Flyweight - 用于高效共享的细粒度实例 示例:拨号音

  • java.lang.Integer #valueOf(int)(也用于布尔,字节,字符, 短而长)

行为

  

这种设计模式是关于Class对象的通信,即你想如何在软件中进行行为?

责任链 - 在一系列对象之间传递请求的方法
示例:贷款或休假审批流程

  • javax.servlet.Filter的#的doFilter()

迭代器 - 按顺序访问集合的元素
示例:电视上的下一个/上一个按钮

  • java.util.Iterator&的所有实现。的java.util.Enumeration

状态 - 在状态更改时更改对象的行为 示例:风扇墙控件

观察者 - 通知更改多个班级的方法
示例:出价或拍卖

  • 发布/订阅JMS API

访问者 - 定义类的新操作而不进行更改 示例:出租车

模板 - 将算法的确切步骤推迟到子类
示例:蓝色打印

  • java.io.InputStream,java.io.OutputStream,java.io.Reader和java.io.Writer的所有非抽象方法。
  • java.util.AbstractList,java.util.AbstractSet和java.util.AbstractMap的所有非抽象方法。
  • javax.servlet.http.HttpServlet,所有doXXX()方法默认发送HTTP 405"方法不允许"响应错误。您可以自由地实施任何一项或任何一项。
    • JMSTemplate Spring中的HibernateTemplate和JdbcTemplate

命令 - 将命令请求封装为对象
示例:"来宾检查"在用餐者是命令模式的一个例子。服务员或女服务员接受客户的订单或命令,并通过将其写入支票来封装该订单。然后该订单排队等待短期烹饪。注意"的垫子检查"每个服务员使用的菜单都不依赖于菜单,因此他们可以支持烹饪许多不同项目的命令。

  • java.lang.Runnable的所有实现

Memento - 捕获并恢复对象的内部状态
示例:在游戏中保存状态&在Windows中撤消/重做操作

  • java.io.Serializable
  • 的所有实现

Mediator - 定义类之间的简化通信
示例:空中交通管制员(ATC)

策略 - 策略定义了一组可互换使用的算法 示例:运输方式

  • java.util.Comparator#compare(),由其他集合执行#sort()。
  • javax.servlet.http.HttpServlet,service()和所有doXXX()方法都使用HttpServletRequest和HttpServletResponse,实现者必须处理它们(而不是将它们作为实例变量来保存!)。
  • javax.servlet.Filter的#的doFilter()

Courtesy
Design Patterns

答案 1 :(得分:2)

我相信这些是两个标准参考:

  1. Head First Design Patterns
  2. Design Patterns
  3. 据我所知,第一个更容易入手。

    我采取了调查此步骤的步骤:

    1. 谷歌“设计模式书”
    2. 阅读this question

答案 2 :(得分:0)

如果您正在寻找C#设计模式,请参阅:

'C#Design Patters a tutorial' - Jame W Cooper

答案 3 :(得分:0)

现在这里有一个可以吸引大量投票的答案。但我会告诉它。

我的建议是,“不要学习设计模式!!!”

坚持设计模式,限制你的创造力。此外,一些设计模式有不好的一面,他们没有告诉你。例如,如果不小心使用,Singleton模式可能会导致问题。

此外,IMO,一些着名的设计模式是用一种语言创建的,以解决该语言的特定问题。但是,像Python和Javascript这样的进化语言可以非常惊人地使用,而不会影响设计模式。

不是学习设计模式,而是学习编程范式和内部概念。我将复制粘贴以下维基百科列表,

  • 强制性,允许副作用,
  • 功能性,不允许副作用,
  • 声明性,未说明执行操作的顺序,
  • 面向对象,它将代码与代码修改的状态组合在一起,
  • 程序将代码分组到 功能,
  • 逻辑,具有特定的执行模式 与特定的语法和语法风格相结合,
  • 符号 具有特定语法和语法风格的编程

当然,您可以阅读标准设计模式以获得一些基本概念。但是不要从A到Z学习它们。它会破坏你的创造力。