`
阅读更多
设计模式


为什么要使用设计模式?

设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。


设计模式的原则
1、"开-闭"原则,可以理解为“对扩展开放,而对修改关闭”。摸块应尽量在不修改原(是"原",指原来的代码)代码的情况下进行扩展。

2、"里氏代换原则 ",用父类或者接口来引用子类对象,里氏代换原则是继承复用的一个基础。

3、"合成复用原则",少用继承多用合成关系来实现。避免修改类时候,"牵一发而动全身",要把波动限制在尽量小的范围。合成:更强的整体与部分,拥有相同的生命周期。一个合成而成的对象完全拥有其组成部分的支配权,包含销灭与创建。

4、依赖倒转原则,抽象不应该依赖于实现,实现应当依赖于抽象。要针对接口编程,而不是针对实现编程。

5、接口隔离原则,定制服务的例子,每一个接口应该是一种角色,不多不少,不干不该干的事,该干的事都要干

6、米特法则,最少知识原则。不要和陌生人说话。在对其它对象的引用上,一个类对其它对象的引用应该降到最低。在类的设计上,只要有可能,一个类应当设计成不变类。在类的结构设计上,每一个类都应当尽量降低成员的访问权限。一个类不应当public自己的属性,而应当提供取值和赋值的方法让外界间接访问自己的属性,减少实现类的可导性。


怎么选择设计模式
首先,目前设计模式分为创建模式,结构模式,行为模式。

所谓创建模式,比较容易理解。
factory工厂模式:
分为简单工厂模式与抽象工厂模式,区别在于简单工厂模式只是简单地创建对象,因为工厂后续产品种类增多就会导致代码改动很大,它扩展性不强。一般代码改动很少,很简单的,可以考虑使用。抽象工厂模式,字里行间已提到了抽象,第一、抽象工厂产品的种类。 第二、抽象工厂产品种类的共同行为与属性。第三、定义工厂的具体产品并实现其抽象接口。第四,定义具体工厂类进行生产产品。

工厂模式其实与bridge(桥接)模式在类抽象思维上差不多。

工厂模式用的很多,我一般建议使用抽象模式,简单工厂模式在简单应用场景才能适用。

理论应用
有人问百度:用简单工厂来创建对象和用new创建对象相比好处有哪些?
有人回答:我不知道你认真研究过设计模式没有?之所以要使用模式思想,是因为要遵循开闭原则,开闭原则就是对修改关闭对扩展开放.开闭原则有五种实现途径,我只提跟你问题相关的一种.也就是开闭原则中比较重要的一条原则:依赖倒转原则,什么是依赖,如果不是很明白你可以先研究一下面向对象之间的几种耦合关系.所谓依赖倒转原则就是,依赖于抽象而不依赖于实现.为什么要依赖于抽象而不依赖于实现,很简单的问题,但要解释我又要引入其他两种开闭原则的实现途径,一、迪米特法则 大意是:将可变性的耦合效应或者说传导效应降到最低,二、里氏代换原则,大意是父类出现的地方子类可以取而代之。依赖于抽象时我们可以很容易的对系统进行扩展,只要是继承自相关接口或者抽象类的新业务,都可以很顺利的插入到系统中去,且对客户端没有任何影响,这就是里氏代换。如果我们依赖抽象,我们就可以减少实现类中可变性的传导问题,不至于动一处而动全身,这就使迪米特法则。好,下面开始正面回答你的问题,new关键字其实是违反依赖倒转原则的一种设计,如果你用new,那么你只能new 具体类型,这样一来就是抽象依赖于实现,显然不符合开闭原则。为了最大限度的遵循开闭原则,我们就要采用各种设计模式去将这种不正确的依赖方向封装起来,只给外界提供正确的依赖方向。

其实,new 对象还是很多,存在即合理,new 对象是有其应用场景的,设计不能过分设计。

prototype原型模式:
复制原型对象创建实例,根据对象克隆深度层次的不同,有浅度克隆与深度克隆。浅度克隆,其实创建了一个新引用对象,其实指向还是原来的实例。深度克隆,则重新创建一个一摸一样的实例对象。原型模式应用场景还是比较多,也不难理解。


Builder生成器模式:
 一. 生成器模式简介
  生成器模式也有称为建造者模式。生成器模式的意图在于将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示(GoF)。在软件设计中,有时候面临着一个非常复杂的对象的创建工作。这个复杂的对象通常可以分成几个较小的部分,由各个子对象组合出这个复杂对象的过程相对来说比较稳定,但是子对象的创建过程各不相同并且可能面临变化。根据OOD中的OCP原则,我们自然应该对这些子对象的创建过程进行变化封装。
  这就是生成器模式的思路。定义一个抽象的建造者的角色(Builder),规定所有具体的建造者都应该具有的功能——这些功能就是如何创建复杂对象的某个特定部分(子对象),而具体如何创建子对象有具体的创建者实现。再定义一个指导者的角色,它把创建者作为工具,知道如何使用这个工具来创建复杂对象。这样,客户在需要创建这个复杂对象的时候,只需要给指导者一个具体的创建者就可以了。至于具体创建者如何创建子对象的细节以及这些子对象之间的差异,不是指导者,也不是客户关心的。
  二. 生成器模式实例
  还以汽车制造作为例子。假定汽车由三个部件组装而成:车身、引擎和轮胎,每个部件的制造以及最后的组装过程都很复杂。一个品牌汽车销售商一般不会自己来完成这些繁琐的过程,而是把它交给汽车零部件制造商。实际上有许多汽车零部件制造商,可以完成不间部件的生产和组装过程。
那么,客户是怎么获得一辆汽车的呢?首先,客户需要选定一个汽车制造商(比如某品牌),然后在选择一个汽车销售商(经纪人)为我们服务。然后,我们只需要告诉销售商我们需要哪个制造商的汽车,接下来,由销售商来代替我们监督汽车制造商一步一步为我们生产所需要的汽车(可以考虑订单式生产方式或对某部分特殊定制,如加长车身)。汽车生产完成后,由汽车制造厂提车就可以了。
在于将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。表示的变化不影响组装的过程,表示的创建变化遵循关闭原则需要进行封装。

Singleton单列模式
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
Singleton也能够被无状态化。提供工具性质的功能, Singleton模式就为我们提供了这样实现的可能。使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection)。
如果你的应用基于容器,那么Singleton模式少用或者不用,可以使用相关替代技术。








分享到:
评论

相关推荐

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

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

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

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

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

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

    23种设计模式详解PDF

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

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

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

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

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

    设计模式解析.pdf

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

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

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

    设计模式之蝉

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

    python设计模式第2版.pdf

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

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

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

    C_设计模式(23种设计模式)

    C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计模式(23种设计模式)C_设计...

    Head First设计模式.pdf

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

    设计模式那点事

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

    java版本的设计模式的实现demo

    设计模式是软件开发中的经典实践,它们为解决特定问题提供了通用、可复用的解决方案。在Java编程中,运用合适的设计模式可以提高代码的可维护性、可扩展性和可复用性。以下是关于Java版本设计模式实现demo的一些补充...

    设计模式之美——教你写出高质量代码

    设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的经验总结。"设计模式之美——教你写出高质量代码"这个主题旨在帮助开发者更好地理解和应用设计模式,从而提升代码的质量和可维护性。设计模式...

    Java设计模式 设计模式介绍

    章节介绍:1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之...

    设计模式:可复用面向对象软件的基础--详细书签版

     “[设计模式]在实用环境下特别有用,因为它分类描述了一组设计良好,表达清楚的面向对象软件设计模式。整个设计模式领域还很新,本书的四位作者也许已占据了这个领域造诣最深的专家中的半数,因而他们定义模式的方法...

    软件设计模式期末作业

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

Global site tag (gtag.js) - Google Analytics