原型形式ITeye - 众发娱乐

原型形式ITeye

2019-01-11 22:11:35 | 作者: 寻巧 | 标签: 原型,目标,形式 | 浏览: 1515

本文参阅:《修炼Java开发技能:在架构中体会设计形式和算法之美   于广编著》。

 

原型形式是指用原型实例指定创立目标的品种,而且经过仿制这些原型来创立新的实例。也便是说,原型形式是经过仿制现在现已存在的目标来创立一个新目标(类似于:孙悟空拔毫毛变出许多的山公)。

 

 在Java中的object供给了clone办法,可以完成仿制的Java类有必要完成一个标识接口Cloneable,表明这个Java类支撑被仿制。假如一个类没有完成这个接口可是调用了clone()办法,Java编译器将抛出一个CloneNotSupportedException反常。

演示代码:

package org.dyb.design.prototype;
public class ConcretePrototype implements Cloneable {
 public ConcretePrototype clone(){
 Object object = null;
 try {
 object = super.clone();
 } catch (CloneNotSupportedException e) {
 e.printStackTrace();
 return (ConcretePrototype)object;
}

 运用:

package org.dyb.design.prototype;
public class Test {
 @org.junit.Test
 public void test(){
 ConcretePrototype cp = new ConcretePrototype();
 ConcretePrototype cpClone = cp.clone();

 Java语言中的clone()办法满意下列联系:

1、关于任何目标x,都有x.clone()!=x,即仿制目标与原型目标不是同一个目标。

2、关于任何目标x,都有x.clone().getClass == x.getClass(),仿制目标与原型目标的类型是相同的。

3、假如目标x的equals()办法界说恰当,那么x.clone.equals(x)应该建立。

 

原型形式浅仿制与原型形式深度仿制:

浅仿制:仿制目标的一切变量都含有与本来的目标相同的值,而一切的对其他目标的引证都依然指向本来的目标。换言之,浅仿制只是仿制所考虑的目标,而不仿制它所引证的目标。

深仿制:在浅仿制的基础上,将引证目标指向被仿制过的新目标,而不再是原有的那些被引证的目标。

package org.dyb.design.prototype;
public class Apple {
 private String color;
 public String getColor() {
 return color;
 public void setColor(String color) {
 this.color = color;

 

package org.dyb.design.prototype;
public class Thing implements Cloneable {
 private String attr;
 private Apple apple;//目标
 @Override
 public Thing clone(){
 Thing t = null;
 try {
 t = (Thing)super.clone();
 } catch (CloneNotSupportedException e) {
 e.printStackTrace();
 return t;
 public String getAttr() {
 return attr;
 public void setAttr(String attr) {
 this.attr = attr;
 public Apple getApple() {
 return apple;
 public void setApple(Apple apple) {
 this.apple = apple;

 测验:

package org.dyb.design.prototype;
public class Test {
 @org.junit.Test
 public void test(){
 Apple a = new Apple();
 a.setColor("red");
 Thing t1 = new Thing();
 t1.setApple(a);
 t1.setAttr("x");
 Thing t2 = t1.clone();
 t2.getApple().setColor("green");
 t2.setAttr("y");
 System.out.println(t1.getAttr());
 System.out.println(t2.getAttr());
 System.out.println(t1.getApple().getColor());
 System.out.println(t2.getApple().getColor());

 成果:

x
y
green
green
特点attr在t1和t2中不相同,由于咱们进行了修正,可是在目标apple中t1和t2用的是同一个引证,并没有从头将apple实例化一个新的目标。这个便是浅仿制。

 

改动后Thing:

package org.dyb.design.prototype;
public class Thing implements Cloneable {
 private String attr;
 private Apple apple;
 @Override
 public Thing clone(){
 Thing t = null;
 try {
 t = (Thing)super.clone();
 if(this.apple != null){
 Apple a = new Apple();
 a.setColor(this.apple.getColor());
 t.setApple(a);
 } catch (CloneNotSupportedException e) {
 e.printStackTrace();
 return t;
 public String getAttr() {
 return attr;
 public void setAttr(String attr) {
 this.attr = attr;
 public Apple getApple() {
 return apple;
 public void setApple(Apple apple) {
 this.apple = apple;

 测验成果:

x
y
red
green

 

运用:

当某公司一次性发送上千万个邮件的时分,假如咱们运用单线程每个邮件0.01秒,那么也至少需求27个小时,假如运用多线程则会将同一个引证的数据进行修正,如上比如,这个时分就运用圆形形式,确保每个发送的内容都是一个新的目标,互不影响。

 

留意:目标仿制的时分结构函数式没有履行的。原理:从内存中(堆内存)以二进制流的方法进行仿制,从头分配一个内存块。那结构函数没有履行就很正常了。

 

运用场景:

1、类初始化需求加载十分多的资源。

2、经过new发生一个目标需求十分繁琐的数据预备或拜访权限。

3、一个目标多个修正者的场景。

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表众发娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章