- 浏览: 67963 次
- 性别:
- 来自: 上海
最新评论
-
java苹果+番茄:
已经修改,感谢大家提的意见;有一年多没进来了,很惭愧;以后一定 ...
java设计模式笔记链接地址汇总 -
youthon:
命令(Command)模式【行为模式第九篇】的链接应为http ...
java设计模式笔记链接地址汇总 -
youthon:
你给的链接只有你自己才能打开,你改改吧
java设计模式笔记链接地址汇总 -
shaozhi_jinni:
[b][/b][i][/i][u][/u]引用引用
[img ...
模板方法(Template Method)模式【行为模式第十篇】 -
Tank03:
慢慢的走~
android开发学习中(已经学会了几个小玩意),兴趣大增
不变(Immutable)模式
一个对象的状态在对象被创建之后就不再变化,这就是不变模式。
一、不变模式有两种模式
1、弱不变模式
一个类的实例的状态是不可变化的,但是这个类的子类的实例具有可能会变化的状态。这样的类符合弱不变模式的定义。
要实现弱不变模式,一个类必须满足下面条件:
第一、所考虑的对象没有任何方法会修改对象的状态,这样一来,当对象的构造子将对象的状态初始化之后,
对象的状态便不再改变。
第二、所有的属性都应当是私有的。不要声明任何的公共的属性,以防客户端对象直接修改任何的内部状态。
第三、这个对象所引用到的其它对象如果是可变对象的话,必须设法限制外界对这些可变对象的访问,以防止外界修改
这些对象。如果可能,应当尽量在不变对象内部初始化这些被引用到的对象,而不要在客户端初始化,然后再
传入到不变对象内部来。如果某个可变对象必须在客户端初始化,然后再传入到不变对象里的话,就应当考虑
在不变对象初始化的时候,将这个可变对象复制一份,而不再使用原来的拷贝。
弱不变模式的缺点是:
第一、一个弱不变对象的自对象可以是可变对象;换言之,一个弱不变对象的子对象可能是可变的
第二、这个可变的子对象可能可以修改父对象的状态,从而可能会允许外界修改父对象的状态。
2、强不变模式
一个类的实例的状态不会改变,同时它的子类的实例也具有不可变化的状态。这样的类符合强不变模式。
要实现强不变模式,一个类必须首先满足弱不变模式所要求的所有条件,并且还要满足下面的条件之一:
第一、所考虑的类所有的方法都应当是final:这样这个类的子类不能够置换掉此类的方法
第二、这个类本身就是final的,那么这个类就不可能会有子类,从而也就不可能有被子类修改的问题。593P
二、不变模式的优缺点
不变模式有很明显的有点:
1、因为不能修改一个不变对象的状态,所以可以避免由此引起的不必要的程序错误;换言之,一个不变模式的对象要比可变的
对象更加容易维护。
2、因为没有任何一个线程能够修改不变对象的内部状态,一个不变对象自动就是线程安全的,
这样就可以省掉处理同步化的开销。一个不变对象可以自由地被不同的客户端共享。
不变模式唯一的缺点是:
一旦需要修改一个不变对象的状态,就只好创建一个新的同类对象。在需要濒繁修改不变对象的环境里,会有大量的不变对象
作为中间结果被创建出来,再被java语言的垃圾回收器收集走。这是一种资源上的浪费。
三、一个用来说明不变模式的复数类例子
一个对象的状态在对象被创建之后就不再变化,这就是不变模式。
一、不变模式有两种模式
1、弱不变模式
一个类的实例的状态是不可变化的,但是这个类的子类的实例具有可能会变化的状态。这样的类符合弱不变模式的定义。
要实现弱不变模式,一个类必须满足下面条件:
第一、所考虑的对象没有任何方法会修改对象的状态,这样一来,当对象的构造子将对象的状态初始化之后,
对象的状态便不再改变。
第二、所有的属性都应当是私有的。不要声明任何的公共的属性,以防客户端对象直接修改任何的内部状态。
第三、这个对象所引用到的其它对象如果是可变对象的话,必须设法限制外界对这些可变对象的访问,以防止外界修改
这些对象。如果可能,应当尽量在不变对象内部初始化这些被引用到的对象,而不要在客户端初始化,然后再
传入到不变对象内部来。如果某个可变对象必须在客户端初始化,然后再传入到不变对象里的话,就应当考虑
在不变对象初始化的时候,将这个可变对象复制一份,而不再使用原来的拷贝。
弱不变模式的缺点是:
第一、一个弱不变对象的自对象可以是可变对象;换言之,一个弱不变对象的子对象可能是可变的
第二、这个可变的子对象可能可以修改父对象的状态,从而可能会允许外界修改父对象的状态。
2、强不变模式
一个类的实例的状态不会改变,同时它的子类的实例也具有不可变化的状态。这样的类符合强不变模式。
要实现强不变模式,一个类必须首先满足弱不变模式所要求的所有条件,并且还要满足下面的条件之一:
第一、所考虑的类所有的方法都应当是final:这样这个类的子类不能够置换掉此类的方法
第二、这个类本身就是final的,那么这个类就不可能会有子类,从而也就不可能有被子类修改的问题。593P
二、不变模式的优缺点
不变模式有很明显的有点:
1、因为不能修改一个不变对象的状态,所以可以避免由此引起的不必要的程序错误;换言之,一个不变模式的对象要比可变的
对象更加容易维护。
2、因为没有任何一个线程能够修改不变对象的内部状态,一个不变对象自动就是线程安全的,
这样就可以省掉处理同步化的开销。一个不变对象可以自由地被不同的客户端共享。
不变模式唯一的缺点是:
一旦需要修改一个不变对象的状态,就只好创建一个新的同类对象。在需要濒繁修改不变对象的环境里,会有大量的不变对象
作为中间结果被创建出来,再被java语言的垃圾回收器收集走。这是一种资源上的浪费。
三、一个用来说明不变模式的复数类例子
//----- package day1114; @SuppressWarnings("serial") public final class Complex extends Number implements java.io.Serializable, Cloneable, Comparable { // 虚数单位 public static final Complex i = new Complex(0.0, 1.0); // 复数的实部 private double re; // 复数的虚部 private double im; // 构造子,根据传进的复数再构造一个数学值的复数 public Complex(Complex z) { re = z.re; im = z.im; } // 根据传进的实部和虚部构造一个复数对象 public Complex(double re, double im) { this.re = re; this.im = im; } // 构造子,根据一个实部构造复数对象 public Complex(double re) { this.re = re; this.im = 0.0; } // 默认构造子,构造一个为零的复数 public Complex() { re = 0.0; im = 0.0; } // 把本复数与作为参数传进的复数相比较 public boolean equals(Complex z) { return (re == z.re && im == z.im); } // 把本对象与作为参数传进的对象相比较 public boolean equals(Object obj) { if (obj == null) { return false; } else if (obj instanceof Complex) { return equals((Complex) obj); } else { return false; } } public int hashCode() { long re_bits = Double.doubleToLongBits(re); long im_bits = Double.doubleToLongBits(im); return (int) ((re_bits ^ im_bits) ^ ((re_bits ^ im_bits) >> 32)); } // 返回本复数的实部 public double real() { return re; } // 返回本复数的虚部 public double imag() { return im; } // 静态方法,返还作为参数传进的复数的实部 public static double real(Complex z) { return z.re; } // 静态方法,返还作为参数传进的复数的虚部 public static double imag(Complex z) { return z.im; } // 静态方法,返还作为参数传进的复数的相反数 public static Complex negate(Complex z) { return new Complex(-z.re, -z.im); } // 静态方法,返还作为参数传进的复数的共轭数 public static Complex conjugate(Complex z) { return new Complex(z.re, -z.im); } // 静态方法,返还两个数的和 public static Complex add(Complex x, Complex y) { return new Complex(x.re + y.re, x.im + y.im); } public static Complex add(Complex x, double y) { return new Complex(x.re + y, x.im); } public static Complex add(double x, Complex y) { return new Complex(x + y.re, y.im); } // 静态方法,返还两个数的差 public static Complex subtract(Complex x, Complex y) { return new Complex(x.re - y.re, x.im - y.im); } public static Complex subtract(Complex x, double y) { return new Complex(x.re - y, x.im); } public static Complex subtract(double x, Complex y) { return new Complex(x - y.re, -y.im); } // 静态方法,返还两个数的乘积 public static Complex multiply(Complex x, Complex y) { return new Complex(x.re * y.re - x.im * y.im, x.re * y.im + x.im * y.re); } public static Complex multiply(Complex x, double y) { return new Complex(x.re * y, x.im * y); } public static Complex multiply(double x, Complex y) { return new Complex(x * y.re, x * y.im); } public static Complex multiplyImag(Complex x, double y) { return new Complex(-x.im * y, x.re * y); } public static Complex multiplyImag(double x, Complex y) { return new Complex(-x * y.im, x * y.re); } // 静态方法,返还两个数的商 public static Complex divide(Complex x, Complex y) { double a = x.re; double b = x.im; double c = y.re; double d = y.im; @SuppressWarnings("unused") double scale = Math.max(Math.abs(c), Math.abs(d)); double den = c * c + d * d; return new Complex((a * c + b * d) / den, (b * c - a * d) / den); } public static Complex divide(Complex x, double y) { return new Complex(x.re / y, x.im / y); } public static Complex divide(double x, Complex y) { double den, t; Complex z; if (Math.abs(y.re) > Math.abs(y.im)) { t = y.im / y.re; den = y.re + y.im * t; z = new Complex(x / den, -x * t / den); } else { t = y.re / y.im; den = y.im + y.re * t; z = new Complex(x * t / den, -x / den); } return z; } // 静态方法,返还复数的绝对值 public static double abs(Complex z) { return z.re * z.re - z.im * z.im; } // 静态方法,返还复数的相位角 public static double argument(Complex z) { return Math.atan2(z.im, z.re); } // 返还复数的字符串 public String toString() { if (im == 0.0) { return String.valueOf(re); } if (re == 0.0) { return String.valueOf(im) + "i"; } String sign = ((im < 0.0) ? "" : "+"); return (String.valueOf(re) + sign + String.valueOf(im) + "i"); } @Override public double doubleValue() { // TODO Auto-generated method stub return 0; } @Override public float floatValue() { // TODO Auto-generated method stub return 0; } @Override public int intValue() { // TODO Auto-generated method stub return 0; } @Override public long longValue() { // TODO Auto-generated method stub return 0; } public int compareTo(Object o) { // TODO Auto-generated method stub return 0; } } //客户端 public class TestComplex{ public static void main(String args[]){ Complex c1 = new Complex(10,20); Complex c2 = new Complex(0,1); Complex res = Complex.mnltiply(c1,c2); System.out.println("Real part = " + res.real()); System.out.println("Imaginary part = " + res.imag()); } }
发表评论
-
java设计模式笔记链接地址汇总
2009-10-24 14:46 2294各位,这些笔记已经生成了pdf,如果有兴趣的可以在本文末尾下载 ... -
MVC模式【行为模式第十三篇】
2009-10-23 23:36 1517MVC模式:就是模型-视 ... -
状态(State Pattern)模式【行为模式第十二篇】
2009-10-23 23:35 1371状态(State Pattern)模式:又称为状态对象模式,状 ... -
责任链(Chain of Responsibility)模式【行为模式第十一篇】
2009-10-23 23:33 1254责任链(Chain of Responsibility)模式 ... -
模板方法(Template Method)模式【行为模式第十篇】
2009-10-23 23:32 1229模板方法(Template Method)模式 模板方法模式 ... -
命令(Command)模式【行为模式第九篇】
2009-10-23 23:31 1416命令(Command)模式: ... -
解释器(Interpreter)模式【行为模式第八篇】
2009-10-23 23:29 1111解释器(Interpreter)模 ... -
观察者(Observer)模式【行为模式第七篇】
2009-10-23 23:28 1280观察者(Observer)模式 ... -
访问者(Visitor)模式【行为模式第六篇】
2009-10-23 23:26 1134访问者(Visitor)模式: 访问者模式是对象的行为模式。 ... -
迭代子(Iterator)模式【行为模式第五篇】
2009-10-23 23:25 1536迭代子(Iterator)模式: 迭代子模式又叫游标(Cur ... -
调停者(Mediator)模式 【行为模式第四篇】
2009-10-23 23:23 2676调停者(Mediator)模式 调停者模式是对象的行为模式。 ... -
策略(Strategy)模式 【行为模式第三篇】
2009-10-23 23:22 1541策略(Strategy)模式 策略模式属于对象的行为模式。其 ... -
备忘录(Memento Pattern)模式 【行为模式第一篇】
2009-10-23 23:19 1994备忘录(Memento Pattern)模式 备忘录模式又叫 ... -
适配器模式举例【结构模式第八篇】
2009-10-23 23:17 1055XMLProperties与适配器模式举例: //---- ... -
适配器模式【结构模式第六篇】
2009-10-23 23:12 1208适配器模式(Adapter Pattern)(另称-变压器模式 ... -
桥梁(Bridge)模式【结构模式第五篇】
2009-10-23 23:09 1368桥梁(Bridge)模式: 一、桥梁模式的用意 桥梁模式 ... -
门面(Facade)模式【结构模式第四篇】
2009-10-23 23:08 1240门面(Facade)模式: 是对象的结构模式。外部与一个子系 ... -
亨元(Flyweight Pattern)模式【结构模式第三篇】
2009-10-23 23:07 1189亨元(Flyweight Pattern) ... -
合成(Composite)模型模式【结构模式第二篇】
2009-10-23 23:04 1399合成(Composite)模型模式: 属于对象的结构模式,有 ... -
代理(Proxy)模式 【结构模式第一篇】
2009-10-23 23:02 1408代理(Proxy)模式 是对 ...
相关推荐
Immutable 的实现原理是 Persistent Data Structure(持久化数据结构),即使用旧数据创建新数据时,要保证旧数据同时可用且不变。同时,Immutable 使用了 StructuralSharing(结构共享),即如果对象树中一个节点...
2.Overview of Docker the latest stuff (DCUS announcements) & CaaS; 3.Overview of Immutable infrastructure and Microservices; 4.Docker and Immutable infrastructure/Microservices working together.
**二、为什么使用Immutable-core?** 1. **性能提升**:通过减少不必要的对象复制,immutable-core利用共享数据结构提高了性能,尤其是在处理大量数据时。 2. **代码简洁**:不可变数据使得代码逻辑更清晰,因为你...
2. **提高性能**:通过利用共享数据结构(如尾递归优化和 Map 的键值对引用不变性),Immutable.js 可以实现高效的浅层拷贝和对比,减少不必要的对象复制。 3. **时间旅行与状态管理**:在 Redux 或其他状态管理库...
简单介绍Immutable.js的一个ppt,主要用于技术分享,内容为imuutabe常用的数据类型和常用的基础api,还有immutable的原理、优缺点的分析。
Mastering Immutable.js 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
在本篇中,我们将深入探讨Guava中使用的三种设计模式:Builder模式、Wrapper模式以及Immutable模式。 ### 1. Builder模式 Builder模式在Guava中主要用来构建复杂对象,例如在`...
com.javapatterns.immutable 不变模式 com.javapatterns.interfaces Java接口 com.javapatterns.interpreter 解释器模式 com.javapatterns.isp 接口隔离原则 com.javapatterns.iterator 迭代子模式 ...
2. `update`:允许你通过函数来更新对象或数组的特定部分,这在处理深层嵌套的数据结构时特别有用。 3. `merge`:合并两个或更多的对象,返回一个新的合并后的对象,原对象保持不变。 4. `push`、`pop`、`unshift`、...
在编程领域,不可变对象(Immutable Object)是一种重要的设计模式,尤其在多线程和并发环境中,它提供了安全性和性能优化。在这个初学者教程中,我们将深入探讨C#中的不可变对象,包括“内部不变性”和“观察不变性...
Immutable Collections Library for Kotlin Immutable collection interfaces and implementation prototypes for Kotlin. For further details see the proposal. Prototype implementation is based on ...
2. **Immutable.js库入门**:讲解如何安装和初始化Immutable.js,以及如何创建和操作基本的不可变数据结构。 3. **高级数据结构**:深入讨论Map、List、Set和Record的使用,包括它们的方法和特性,如`get`、`set`、...
go-immutable-radix, 在Golang中,一个不可变的基数树实现 go-immutable-radix 提供实现不可变 radix的iradix 包。 包只提供单个 Tree 实现,针对稀疏节点优化。作为一个基数树,它提供以下内容:O(k) 操作。在许多...
不可变视图-其他集合对象的不可变视图概述... immutable-views包中的视图类实现了相应的Python集合类型的完整行为,除了会修改集合对象的任何操作之外。 视图类将所有操作委托给它们作为视图的原始集合对象。 因此
let list = Immutable.List([1, 2, 3]); list = list.push(4); console.log(list); // List [ 1, 2, 3, 4 ] ``` **总结** `immutable.js`库为Node.js开发带来了不可变数据集合的便利,通过引入不可变性和持久化...
在Kotlin编程语言中,`kotlinx.collections.immutable`是一个重要的库,它提供了不可变集合的实现。不可变集合是一旦创建后就不能修改的集合,这种数据结构在多线程环境、函数式编程和构建安全的数据模型时非常有用...
提供一个抽象的ImmutableCollection类,该类扩展(并限制了)SplFixedArray类,并提供(派生的)不可变集合类具有行为逻辑的多个特征。 为什么用这个 常规的php“数组”根本不是数组,而是经过排序的哈希图。 它们...
第1章 Single Threaded Execution——能通过这座桥的,只有一个人 第2章 Immutable——想破坏它也没办法 第3章 Guarded Suspension——要等到我准备好喔 第4章 Balking——不需要的话,就算了吧 第5章 Producer-...
本文将深入探讨“前端开源库-redux-immutable”,这是一个专为Redux设计的库,旨在解决在处理状态时的不变性问题。 Redux 是一个流行的状态管理库,它在JavaScript应用中扮演着中央数据仓库的角色,负责存储所有的...
不可变的 不变的MongoDB。 该库是NodeJS mongodb API的直接替换方法的集合,这些方法允许mongodb用作不可变数据库。 实现是幼稚的,并且不强制执行锁定,而Mongo仅在文档级别上支持该锁定。 它尚未在生产中经过测试...