Java原型设计模式(Prototype)

发表于:2014-3-20 10:59

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:YJian2008    来源:51Testing软件测试网采编

public class Student2 implements Cloneable {
private String name;
private int age;
private Professor2 professor;
public Student2(String name, int age, Professor2 professor) {
this.name = name;
this.age = age;
this.professor = professor;
}
@Override
public String toString() {
return "Student2 [name=" + name + ", age=" + age + ", Professor2="
+ professor.toString() + "]";
}
@Override
public Object clone() {
Student2 o = null;
try {
// 在运行时,Object中的clone识别出你要复制的是哪一个对象,Object中的clone()
// 然后为此对象分配空间,并进行对象的复制,将原始对象的内容一一复制到新对象的存储空间中。
o = (Student2) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
o.professor = (Professor2) professor.clone();
return o;
}
public static void main(String[] args) {
Professor2 professor = new Professor2("beijing", 12.0);
Student2 s1 = new Student2("zhangsan", 18, professor);
Student2 s2 = (Student2) s1.clone();
System.out.println(s1);
System.out.println(s2);
System.out.println("**************************************");
s2.name = "lisi";
s2.age = 20;
s2.professor.setAddress("shanghai");
s2.professor.setSalary(230.0);
System.out.println(s1);
System.out.println(s2);
}
}
Student2 [name=zhangsan, age=18, Professor2=Professor2 [address=beijing, salary=12.0]]
Student2 [name=zhangsan, age=18, Professor2=Professor2 [address=beijing, salary=12.0]]
**************************************
Student2 [name=zhangsan, age=18, Professor2=Professor2 [address=beijing, salary=12.0]]
Student2 [name=lisi, age=20, Professor2=Professor2 [address=shanghai, salary=230.0]]
  模拟clone方法进行浅拷贝
public interface Prototype {
public Prototype clone();
public void setName(String name);
public String getName();
}
<span style="font-size:14px;">public class ConcretePrototypeA implements Prototype {
private String name;
public ConcretePrototypeA() {
}
public ConcretePrototypeA(String name) {
this.name = name;
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public String getName() {
return this.name;
}
@Override
public Prototype clone() {
ConcretePrototypeA prototype = new ConcretePrototypeA();
prototype.setName(this.name);
return prototype;
}
@Override
public String toString() {
return "ConcretePrototypeA [name=" + name + "]";
}
}</span>
public class TestPrototype {
public static void main(String[] args) {
ConcretePrototypeA prototypeA = new ConcretePrototypeA("jimmy");
ConcretePrototypeA prototypeA2 = (ConcretePrototypeA) prototypeA
.clone();
System.out.println(prototypeA);
System.out.println(prototypeA2);
}
}
ConcretePrototypeA [name=jimmy]
ConcretePrototypeA [name=jimmy]
  6、应用场景
  系统需要创建的对象是动态加载的,而且产品具有一定层次时,可以考虑使用原型模式。原型模式多用于创建复杂的或者耗时的实例, 因为这种情况下,复制一个已经存在的实例可以使程序运行更高效,或者创建值相等,只是命名不一样的同类数据。
  1>当要实例化的类是在运行时刻指定时,例如,通过动态装载;
  2>或者为了避免创建一个与产品类层次平行的工厂类层次时;
  3>或者当一个类的实例只能有几个不同状态组合中的一种时。
  4>建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
  比如有一个对象,在某一时刻该对象中已经包含了一些有效的值,此时可能会需要一个和该对象完全相同的新对象,并且此后对新对象的任何改动都不会影响到原来对象中的值,也就是说新对象与原来的对象是两个独立的对象,但新对象的初始值是由原来的对象确定的。
  7、赋值创建对象
  1>java中赋值创建对象是可以实现对象的重用的,但是新对象和原对象是同一个引用;如果修改其中的一个对象的值,则另外的一个对象也会发生改变。
  2>使用clone方法会返回对象的一个拷贝,这样一来,如果修改一个对象的值,则另外的对象不会发生改变的。
  8、拷贝分为"浅拷贝"和"深拷贝"
  浅拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
  深拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制(那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象)。换言之,深复制把重复的对象所引用的对象都复制一遍,而这种对被引用到的对象的复制叫做间接复制。
  <span style="font-size:14px"></span>
33/3<123
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号