`
zhanghteye
  • 浏览: 51277 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

设计模式

 
阅读更多

1、单例模式

确保某一个类只有一个实例,并提供一个全局访问点。

优点:

       减少内存开支,减少性能开销、避免资源多重占用,共享资源访问

缺点:

       不易拓展,不利于测试,与单一职责原则冲突(根据环境考虑是否单例)。

使用场景:

       创建一个对象需要消耗过多的资源,如访问数据库

       要求生成唯一序列号的环境

       需要一个共享访问资源时,如计数器

2、工厂方法模式

为创建一个对象定义一个接口,但让子类决定实例化哪个类。

注:典型的解耦框架,工厂方法使一个类的实例化延迟到其子类。(反射,Class.forName)

优点:降低耦合,可拓展,屏蔽产品类(重要)

使用场景:

       JDBC连接数据库,数据库切换只需改驱动名称

3、抽象工厂模式

为创建一组相关联或相互依赖的对象提供一个接口,而且无需指定它们的具体实现类。

注:常用

优点:

       封装性,不关系对象创建细节。

       产品族内的约束为非公开状态。

缺点:

       产品族不易拓展。

使用场景:

       一个对象族(或是一组没有任何关系的对象)都有相同的约束。

      如约束与操作系统类型,可使用抽象工厂模式生产不同操作系统下的编辑器和图片处理器。

4、模板方法模式

定义一个操作中的算法的框架,而将一些步骤延迟到子类中。

注:模板方法让子类可以在不改变算法的结构的情况下,重定义该算法的某些步骤。

优点:

       封装不变部分,拓展可变部分

       提取公共部分代码,便于维护

       行为由父类控制,子类实现

缺点:

       子类影响父类,增加代码阅读难度

使用场景:

       多个子类有公有的方法,并且逻辑基本相同时。

       复杂算法,核心模块统一,细节模块由实现类实现。

       重构,经常使用,将相同的方法抽到父类。

5、创建者模式

将一个复杂对象的构建从它的表现形式中分离,使得同样构建过程可以创建不同的表现形式。

优点:封装、独立易拓展、便于控制细节风险。

使用场景:

        相同的方法,执行不同的顺序,产生不同的事件结果时。

        多个部件或零件,都可以封装到一个对象中,但是产生的运行结果不同时。

        产品类非常复杂,或者产品类中的调用顺序不同产生不同的效能。

对比:

        创建者模式关注的是零件类型和装配工艺(顺序),与工厂方法模式最大不同的地方,虽然同为创建类模式,注重点不同。

6、代理模式

为其他对象提供一个代理对象来控制访问它。

注:使用率非常高

优点:职责清晰、高拓展性、智能化

缺点:

使用场景:struts表单映射到对象、SpringAOP动态

7、原型模式

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

优点:性能优良、不受构造函数约束

缺点:逃避构造函数的约束

使用场景:资源优化、性能安全要求、一个对象多个修改者

8、中介者模式

用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

优点:减少类间的依赖,把原来一对多的依赖变为一对一的依赖

缺点:中介者会膨胀

使用场景:多个对象直接紧密耦合,即出现类似蜘蛛网状结构。有利于梳理为星型结构。

9、命令模式

将一个请求封装成一个对象,从而让你使用不同的请求参数化客户端,排队或记录请求,支持撤回操作。

注:高内聚模式

优点:类间解耦、可拓展性

缺点:命令多,类会膨胀

使用场景:

       GUI按钮点击、DOS命令、触发反馈机制处理

10、责任链模式

使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条传递该请求,直到有对象处理它为止。

注:链。

优点:将请求跟处理分开。

缺点:性能问题,调试不方便。

使用场景:注册用户VIP跟普通用户处理。

11、装饰模式

动态地给一个对象添加一些额外的职责。就增加功能而已,装饰模式相比生成子类更为灵活。

注:比较常见,继承是静态地给类增加功能,装饰模式是动态地增加功能。

优点:装饰类跟被装饰类可以独立发展,而不会相互耦合。

          装饰模式是继承关系的一个代替方案。

          装饰模式可以动态拓展一个实现类的功能。

          拓展性非常好。

缺点:

          多层装饰比较复杂。尽量减少装饰类数量降低系统的复杂度。

使用场景:

       拓展一个类的功能。

       动态给一个对象增加功能。

       为一批兄弟类进行改装或加装功能。

12、策略模式

定义一组算法,将每个算法封装起来,并且使它们之间可以互换。

注:简单

13、适配器模式

将一个类的接口编程客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

14、迭代器模式

它提供一种方法访问一个容器对象中的各个元素,而又不需暴露该对象的内部细节。

15、组合模式

将对象组合成树形结构以表示“部分-整体”的层次结构,是的用户对单个对象和组合对象的使用具有一致性。

16、观察者模式

定义对象间一种一对多的依赖关系,是的每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。

17、门面模式

为子系统中的一组接口提供一个统一的接口。门面模式顶一个一个更高层次的接口以便子系统更好的使用。

注:外观模式,常用的封装模式。

优点:减少系统的相互依赖、提高灵活性、提高安全性

缺点:不符合开闭原则,要修改只能修改门面角色。

使用场景:

       为复杂模块或子系统提供外界访问的接口。

       子系统独立,对外来说相当于黑箱

       预防低水平人员带来的风险扩散

18、备忘录模式

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

使用场景:

       需要保存和回复数据的相关状态场景

       提供一个回滚操作,Word的ctrl+z组合键,ie浏览器的后退按钮

       需要监控的副本

       数据库连接的事务管理

19、访问者模式

封装一些作用于某中数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

注:相对简单

优点:符合单一职责原则、优秀的拓展性、灵活性高

缺点:具体元素对访问者公开细节、具体元素变更比较困难、违背依赖倒置原则

20、状态模式

当一个对象内在状态改变时允许其盖被行为,这个对象看起来像改变了其类。

优点:结构清晰、遵循设计原则、封装性好

缺点:类膨胀

使用场景:行为随状态改变而改变的场景(权限设计)、条件、分支判断语句的代替者。

21、解释器模式

给定一种语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。

注:简单的语法分析工具

优点:可拓展性

缺点:膨胀、递归导致调试复杂、大量循环递归导致效率低

使用场景:重复发生的问题、简单语法、SQL语法分析

22、亨元模式

使用共享对象可有效地支持大量的细粒度的对象。

注:池技术的重要实现方式

优点:减少对象创建、降低内存占用、增强程序性能

缺点:提高系统复杂度,分离外部状态和内部状态

使用场景:系统存在大量相似对象、对象没有特定身份、需要缓冲池。

23、桥梁模式

将抽象和实现解耦,使得两者都可以独立地变化。

注:简单,尽可能将变化封装到最小力度、聚合、解决继承入侵性

优点:抽象和实现分离、易拓展、细节透明

缺点:

使用场景:不适合继承、接口或抽象类不明确、重用性要求高

 

六大原则

单一职责原则

一个类或者一个接口,最好只负责一项职责。

里氏替换原则

在使用基类的地方可以任意使用其子类。

依赖倒置原则

依赖于抽象

接口隔离原则

一个类对另一个类的依赖应该建立在最小的接口上。

迪米特法则

一个对象应该对其他对象保持最少的了解。

合成复用原则

尽量使用合成/聚合的方式,而不是使用继承。

开闭原则

一个软件实体应该对拓展开放,对修改关闭。

 

分享到:
评论

相关推荐

    24种设计模式以及混合设计模式

    设计模式是软件工程中的一种重要思想,它是在特定情境下,为解决常见问题而形成的一套最佳实践。在本文中,我们将深入探讨24种设计模式,并结合混合设计模式的概念,以及它们在实际项目中的应用案例。 首先,设计...

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

    人人都懂设计模式 设计模式是软件开发中的一种解决方案,它提供了一种通用的设计思想和方法论,可以帮助开发者更好地设计和实现软件系统。设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。 在本书中...

    二十三种设计模式【PDF版】

    主要是介绍各种格式流行的软件设计模式,对于程序员的进一步提升起推进作用,有时间可以随便翻翻~~ 23种设计模式汇集 如果你还不了解设计模式是什么的话? 那就先看设计模式引言 ! 学习 GoF 设计模式的重要性 ...

    Java 经典设计模式讲解以及项目实战

    Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...

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

    GOF(Gang of Four)设计模式,由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位专家在他们的著作《设计模式:可复用面向对象软件的基础》中提出,被誉为设计模式的经典之作。本资源包含了GOF设计...

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

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

    设计模式解析.pdf

    ### 设计模式解析:深入理解软件设计的核心原则与实践 #### 标题解析:设计模式解析 设计模式是软件工程领域的重要概念,旨在提供解决常见软件设计问题的模板或指导原则。《设计模式解析》这一标题暗示了书籍将...

    C#设计模式.PDF

    根据提供的文档概览,我们可以对每个章节所涉及的设计模式进行详细的阐述和解释。下面将针对文档中提及的设计模式逐一展开,以便更好地理解这些模式的概念、结构、应用场景以及优缺点。 ### 1. 面向对象程序设计...

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

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

    设计模式之蝉

    在计算机科学领域,设计模式是软件工程中用于解决特定问题的一般性方案,它们是经过实践检验的最佳实践。这些模式被广泛应用于面向对象软件设计中,能够提高代码的可重用性、灵活性和可维护性。设计模式通常被划分为...

    python设计模式第2版.pdf

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

    《Java设计模式》课程设计报告.docx

    《Java设计模式》课程设计报告主要探讨了如何利用Java编程语言和MyEclipse集成开发环境来实现基于设计模式的西瓜市场系统。这个项目涵盖了四种重要的设计模式:单例模式、代理模式、建造者模式和抽象工厂模式,为...

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

    《新版设计模式手册 - C#设计模式(第二版)》是一部深入探讨C#编程中设计模式的权威指南,尤其适合已经有一定C#基础并希望提升软件设计能力的开发者阅读。设计模式是解决软件开发中常见问题的经验总结,是软件工程的...

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

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

    设计模式精解- GoF 23种设计模式解析附C++实现源码

    设计模式精解- GoF 23种设计模式解析附C++实现源码 懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要。反之好像也可能成立。道可道,非常道。道不远人,设计模式亦然如此。 一直想把自己的学习经验以及在...

    Head First设计模式.pdf

    全书用两章篇幅对设计模式和GRASP作了基本介绍,3种设计模式的讲解:对于每一种模式,先给出定义,接着通过类比方式用一个现实世界中的例子说明模式的应用,然后分别以C#和Java代码例述模式的架构实现。最后一章给出...

    MongoDB应用设计模式

    资源名称:MongoDB应用设计模式内容简介:无论是在构建社交媒体网站,还是在开发一个仅在内部使用的企业应用程序,《MongoDB应用设计模式》展示了MongoDB需要解决的商业问题之间的连接。你将学到如何把MongoDB设计...

    设计模式那点事

    设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决问题的可重用解决方案。《设计模式那点事》这本书的PPT为我们提供了一种深入理解和学习设计模式的途径。在这里,我们将深入探讨设计模式的核心概念、...

Global site tag (gtag.js) - Google Analytics