永久地址✅✅gdsbet.com✅✅
沙龙365国际 旁边一个公司领导,那小老头惊奇道:“咱们网络电视部门什么时候招进来这么一个人才?”
住持认输了,几个方才被打的和尚一脸憋闷。
想入侵一个专业搞这种网络防护的机构,还是神不知鬼不觉没有人发现,这几乎是不可能的事情!序言
以下为本人写的其他设计模式,感兴趣的同学可以查阅。
面向对象设计原则
白话设计模式之单例模式
原型模式(prototype pattern)
使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。(将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝自己来实现创建过程。原型模式是一种“另类”的创建型模式,创建克隆对象的工厂就是原型类自身,工厂方法由克隆方法来实现。通过克隆方法所创建的对象是全新的对象,它们在内存中拥有新的地址,通常对克隆所产生的对象进行修改对原型对象不会造成任何影响,每一个克隆对象都是相互独立的)
扩展
java语言提供的cloneable接口和serializable接口的代码非常简单,它们都是空接口,这种空接口也称为标识接口,标识接口中没有任何方法的定义,其作用是告诉jre这些接口的实现类是否具有某个功能,如是否支持克隆、是否支持序列化等。
通用实现
通用实现指的是不限定那种语言(这里使用java语言做示例),原型模式主要包括:prototype(抽象原型)它申明了克隆方法,是所有具体原型实现的父类,该类可以是接口、抽象类;concreteprototype( 具体原型类)实现/继承了父类的克隆方法,并返回一个自己的实例对象。具体我们以生产电脑为例:如何使用原型模式实现生产出联想和苹果电脑的不同系列产品,每个系列的产品外观配置材质都是一样的,唯一不同的是没台电脑都拥有唯一的mac地址,具体类图如下所示。
通用实现示例
computerprototype抽象电脑原型父类,包含了克隆抽象方法clone(),电脑系列名‘name’属性的get和set方法;
applecomputer,lenovecomputer具体的电脑原型实现类,实现了父类的clone()方法,并new出自身实例返回。
具体实现类克隆方法代码片段:
联想电脑具体电脑原型实现
测试客户端代码片段:
测试客户端调用
java中的原型
java所有类都继承自java.lang.object,object类提供了一个clone()方法用于复制java对象。因此java类可以直接使用clone()方法进行复制自身对象,注意能够实现克隆的java类必须实现一个标识接口cloneable,表示这个java类支持被复制。如果一个类没有实现这个接口但是调用了clone()方法,java编译器将抛出一个clonenotsupportedexception异常。
下面我们使用java自带的原型模式实现联想电脑不同系列产品的生产,具体类图如下所示:
联想电脑类
lenovocomputer实现了java的cloneable接口,自己实现了一个克隆方法(clone),该克隆方法里调用超级父类(java.lang.object)的clone()方法得到一个object对象,并将该对象进行强制类型转换为lenovocomputer返回给调用客户端。
测试客户端调用代码片段如下所示:
客户端调用
浅克隆
在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。简单来说,在浅克隆中,当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。(java自带的覆盖object的clone方法即为浅克隆)
深克隆
在深克隆中,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。简单来说,在深克隆中,除了对象本身被复制外,对象所包含的所有成员变量也将复制。java中需要实现深度克隆需要通过序列化的方式来实现(serialization:序列化起始就是讲对象的一个拷贝写到流中,而原来的对象仍然存在于内存中),序列化不仅能够拷贝对象本身,而且能够拷贝对象的引用成员对象,因此通过序列化将对象写到一个流中,再从流里将其读出来,可以实现深克隆,但是前提条件是原型类(需要复制/克隆类)必须实现serializable接口。
我们以生产联想电脑并为没台电脑配置一个鼠标为例来展示原型模式的深度克隆,具体类图如下所示:
深度克隆
serializable,cloneable为java自带的标识类;
lenovocomputer具体的原型shi实现类(联想电脑类),mouse为鼠标类。lenovocomputer定义了一个深度克隆方法deepclone(),该方法内通过字节数组输出流读取当前对象,然后在通过字节数组输入流对去到该输出流,通过对象流进行装饰后强制转换为lenovocomputer类型返回给调用者,代码片段如下所示。
通过测试客户端的调用,我们可以看到能够正确输出电脑类型,鼠标类型,并且克隆出来的对象和原来的对象地址是不相等的。深度克隆和浅克隆区别在于深度克隆可以克隆对象的引用类型属性。
总结
优点
在创建复杂对象时可以简化实例创建,同时提高实例的创建效率
可以使用深克隆的方式保存对象的状态,使用原型模式将对象复制一份并将其状态保存起来,以便在需要的时候使用( 如恢复到某一历史状态) ,可辅助实现撤销操作
缺点
需要为每一个类配备一个克隆方法,而且该克隆方法位于一个类的内部,当对已有的类进行改造时,需要修改源代码,违背了“开闭原则”。
张烨解释道:“白天参加魏编辑的葬礼呢,我都开静音了。
门关,人走了。
| | |
国家税务总局办公厅主办 电子税务管理中心凯发一触即发的技术支持
凯发一触即发的版权所有:国家税务总局 京icp备13021685号-2 地址:北京市海淀区羊坊店西路5号 邮编:100038 |