`

四十四:不变模式

阅读更多
一:什么是不变模式
一个对象的状态在对象被创建之后就不再变化,这就是所谓的不变模式.不变模式可样强对象的强壮性,它允许多个对象共享某一对象,降低了对该对象进行并发访问时的同步化开销,如果需要修改一个不变对象的状态,那么就需要建立一个新的同类型对象,并在创建时将这个新的状态存储在新的对象里。
不变模式只涉及到一个类,一个类的内部状态创建后,在整个生命期间都不会发生变化时,这样的类称做不变类,这种使用不变类的做法叫做不变模式.不变模式有两种形式:弱不变模式和强不变模式
(A)弱不变模式
一个类的实例的状态是不可变化的,但是这个类的子类的实例具有可能会变化的状态。要实现弱不变模式,一个类必须满足下面条件:
(1).所考虑的对象没有任何方法会修改对象的状态.
(2)所有属性都应当是私有的
(B)强不变模式
一个类的实例的状态不会改变,同时它的子类的实例也具有不可变化的状态。要实现强不变模式一个类必须首先满足弱不变模式所要求的所有条件,并且还要满足下面的条件之一:
(1)所考虑的类所有的方法都应当是final,这样这个类的子类不能置换掉此类的方法
(2)这个类本身就是final的,那么这类就不可能会有子类,从而也就不可能有被子类修改的问题.

二:不变模式在Java语言中的应用
(1)String类
String youSay="Hi";
String iSay="Hi";
Java虚拟机其实只会创建这样一个字符串的实例,而这三个String对象都在共享这一个值。如果程序所处理的字串有频繁的内容变化,就不宜使用String类型,而应当使用StringBuffer类型,如果需要对字串做大量的循环查询,也不宜使用String类型,应当考虑使用byte或char数组.
(2)封装类
String类实际上是一个封装类,因为它包装了一个char的数组,此外还有Integer....(这些封装类存在的必要性:像Vector等无法放基本的数据类型long.. .)
这些封装类实际上都是强不变类,它们都是final的

三:不变模式的的优缺点
(1)因为不能修改一个不变对象的状态,所以可以避免由此引起的不必要的程序错误,换言之,一个不变的对象要比可变的对象更加容易维护
(2)因为没有任何一个线程能够修改不变对象的内部状态,一个不变对象自动就是线程安全的,这样就可以省掉处理同步化的开销
(3)唯一缺点是一旦需要个性一个不变对象的状态,就只好创建一个新的同类对象,在需要频繁修改不变对象的环境里,会有大量的不变对象作为中间结果被创建出来,再被Java的垃圾收集器收走,这是一种资源的浪费。
分享到:
评论

相关推荐

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

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

    程序设计模式作业十四(行为型模式四)1

    - 它封装了不变部分,扩展可变部分,使得代码结构稳定,易于维护。 - 它定义了算法的骨架,使得子类可以不改变算法结构即可重定义特定步骤。 缺点: - 过度使用继承可能会导致类的数量过多,使得系统变得复杂。 - ...

    第二十九讲:基础四依赖倒转原则

    这样,即使底层实现发生变化,只要接口保持不变,高层模块就无需修改。 3. **实现接口**:底层模块实现接口或继承抽象类,提供具体的功能实现。 4. **接口注入**:通过构造函数、依赖注入框架或者工厂模式等方式,...

    中科大 汪增福 模式识别 期末考试试卷

    - **知识点十四**:**最小风险判决** - 最小风险判决不仅与模式发生的先验概率有关,还与错误判断的代价等因素相关。 - **知识点十五**:**正态随机向量** - 如果X是d维的正态随机向量,C是与X同维的常向量,则CTX...

    java设计模式

    本压缩包包含了对全部二十四种经典设计模式的Java实现,下面将对这些模式进行详细解释。 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。常用实现方式有饿汉式、懒汉式、双重检查锁定和静态内部类等...

    java的设计模式

    Java设计模式是软件工程中的一种最佳实践,它是一种在特定情境下解决常见问题的经验总结,...在学习过程中,可以结合《设计模式:可复用面向对象软件的基础》这本书,以及提供的"设计模式_20091017.pdf"文档深入研究。

    经典设计模式总结

    3. **抽象工厂模式:** 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 **应用场景:** 适用于系统中产品等级结构稳定,希望减少客户端代码与产品类间的耦合度的情况。 #### 五、单例模式...

    LBP.rar_LBP matlab_LBP旋转 matlab_LBP特征可视化_lbp可视化_旋转不变 LBP

    在LBP的四种主要模式中: 1. **一般LBP(Basic LBP)**:是最简单的形式,它通过比较中心像素与周围8个像素的灰度差异来生成二进制码。如果周围像素灰度值大于中心像素,则相应位置的二进制位为1,否则为0。最终...

    PHP设计模式-面向对象开发必备

    **十四、动态记录模式** 动态记录模式(有时称为日志模式)主要用于记录对象的状态变化。在PHP中,可以使用 Trait 来实现这个模式,方便地在类中添加日志记录功能。 通过理解和应用这些设计模式,PHP开发者能够写出...

    设计模式总结及代码

    四、建造者模式 建造者模式将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。C++中,可以通过步骤化的构建过程,避免直接暴露复杂的构造函数。 五、原型模式 原型模式使用原型实例指定创建...

    华南师范大学-数据库-期末复习知识点汇总.pdf

    * 关系模式:关系的结构,如 student (student-no, name, sex) * 关系实例:在某一特定时刻上关系的内容,如 student-nonamesex1JonesMale2SmithMale * 模式和实例是两个对立的概念 十一、关系代数 * 选择:在关系...

    JAVA设计模式

    ### 四、代理模式 代理模式为其他对象提供一种代理以控制对这个对象的访问。在Java中,静态代理和动态代理(JDK Proxy)都是实现这一模式的方式,动态代理可以动态生成代理类,适用于需要动态控制目标对象的情况。 ...

    有色金属行业:全球避险模式重归十年前,黄金双面性交易再度显现.pdf

    即便如此,鉴于全球流动性环境的宽松,黄金价格在1500美元附近的支撑将逐步稳固,市场预期金价在未来有望回归1650美元,并保持1800美元/盎司的年内目标不变。 除了黄金之外,其他有色金属如小金属和稀土也受到市场...

    DCVCN模式形成的数值分析PPT学习教案.pptx

    计算动词理论作为一种新兴的理论框架,在过去十多年的快速发展过程中,不仅自身得到了显著的进步,还极大地促进了其他学科领域的研究和发展。这一理论的核心在于利用计算动词来模拟和分析复杂系统的动态变化。其中...

    55.深度解密五十五:利用互联网思维进行实体行业“吸粉和变现”(实用性).pdf

    在《深度解密二十四:网络营销之如何进行有价值的活动营销“拉新”》中我们讲解过通过“线上”或者“线下”的活动进行拉新。而这篇文档我将给大家带来一种全新不一样的吸粉思维,这种思维就是建立在客户的心理而进行...

    四级 数据库工程师

    - **物理独立性**:当数据的物理存储结构改变时,通过调整模式/内模式映像关系,保持数据库模式不变,确保应用程序不受影响。 #### 五、DBMS主要功能 - **数据定义**:定义数据的结构和约束条件。 - **数据操纵**:...

    \PADS2005快捷键

    四、角度快捷键(Angles) - AA: 转换到任意角度模式。 - AD: 转换到斜角度模式。 - AO: 转换到直角模式。 五、取消快捷键(Undo) - UN[]: 可取消多次操作,为可选参数。 - RE[]: 重复多次操作。 六、设计规则...

    自制多功能莫尔斯电码学习器_王瑞.pdf

    - 听模式:播放标准莫尔斯电码声音。 - 学模式:对比用户输入与标准电码,提供反馈。 - 练模式:仅播放用户输入的电码。 #### 莫尔斯电码基本规则 - **点(·)** 和 **划(—)** 的组合代表不同的字符。 - **...

    四级数据库笔记(精简)

    2. **逻辑独立性**:当数据库模式变化时,通过调整外模式/模式映像关系来保持外模式不变,从而使应用程序不必修改。 #### 五、DBMS的主要功能 1. **数据定义**:创建、删除和修改数据库对象。 2. **数据操纵**:...

Global site tag (gtag.js) - Google Analytics