客户端如果需要使用一个类的实例时通常是使用这个类的构造方法以及setter 方法去构建这个类的实例。但是在某些情形下,可能不允许直接调用构造方法或者是为了解决Java 的值引用问题。 在设计模式中 建造者模式、工厂方法、抽象工厂都可以避免客户端直接调用构造方法。同样原型模式也可以解决这个问题。
首先需要知道在JAVA 中所有的引用都是值引用。
/** * * @author zhangwei * @version $Id: TestModel.java, v 0.1 2014年9月23日 上午9:24:41 zhangwei Exp $ */ public class TestModel { //值 String value; /** * Getter method for property <tt>value</tt>. * * @return property value of value */ public String getValue() { return value; } /** * Setter method for property <tt>value</tt>. * * @param value value to be assigned to property value */ public void setValue(String value) { this.value = value; } }
/** * * @author Lenovo * @version $Id: ValueReferenceClient.java, v 0.1 2014年9月23日 上午9:22:20 Lenovo Exp $ */ public class ValueReferenceClient { /** * * @param args */ public static void main(String[] args) { TestModel u = new TestModel(); u.setValue("123"); TestModel m = u; u.setValue("456"); System.out.println(MessageFormat.format("m.value={0}|u.value={1} ", m.getValue(), u.getValue())); } }
结果是:m.value=456|u.value=456
上述就是由于值引用导致的问题,有的时候需要并不是这个对象的引用而是这个对象的副本。此时原型模式就可以凸显作用了。
/** * * @author Lenovo * @version $Id: UserModel.java, v 0.1 2014年9月23日 上午9:03:51 Lenovo Exp $ */ public class UserModel implements Cloneable { private String userId; private String bindMobile; private String contact; private String address; private String certNo; /** * Getter method for property <tt>userId</tt>. * * @return property value of userId */ public String getUserId() { return userId; } /** * Setter method for property <tt>userId</tt>. * * @param userId value to be assigned to property userId */ public void setUserId(String userId) { this.userId = userId; } /** * Getter method for property <tt>bindMobile</tt>. * * @return property value of bindMobile */ public String getBindMobile() { return bindMobile; } /** * Setter method for property <tt>bindMobile</tt>. * * @param bindMobile value to be assigned to property bindMobile */ public void setBindMobile(String bindMobile) { this.bindMobile = bindMobile; } /** * Getter method for property <tt>contact</tt>. * * @return property value of contact */ public String getContact() { return contact; } /** * Setter method for property <tt>contact</tt>. * * @param contact value to be assigned to property contact */ public void setContact(String contact) { this.contact = contact; } /** * Getter method for property <tt>address</tt>. * * @return property value of address */ public String getAddress() { return address; } /** * Setter method for property <tt>address</tt>. * * @param address value to be assigned to property address */ public void setAddress(String address) { this.address = address; } /** * Getter method for property <tt>certNo</tt>. * * @return property value of certNo */ public String getCertNo() { return certNo; } /** * Setter method for property <tt>certNo</tt>. * * @param certNo value to be assigned to property certNo */ public void setCertNo(String certNo) { this.certNo = certNo; } /** * @see java.lang.Object#clone() */ @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } /** * @see java.lang.Object#toString() */ @Override public String toString() { return "UserModel [userId=" + userId + ", bindMobile=" + bindMobile + ", contact=" + contact + ", address=" + address + ", certNo=" + certNo + "]"; } }
/** * * @author Lenovo * @version $Id: Client.java, v 0.1 2014年9月23日 上午9:06:15 Lenovo Exp $ */ public class Client { /** * * @param args * @throws CloneNotSupportedException */ public static void main(String[] args) throws CloneNotSupportedException { UserModel source = new UserModel(); source.setAddress("杭州西湖区万塘路18号黄龙时代广场"); source.setUserId("2088123456123456"); source.setBindMobile("13916309243"); source.setCertNo("32132019900912"); source.setContact("13916309243"); UserModel dest = (UserModel) source.clone(); System.out.println(dest == source); } }
结果是:false
这种是借助Object.clone()方法实现原型模式,但是该方法也是有一定的局限性,如果对象的属性是一个数组或者其他对象则没有办法对其进行clone.
此时可以使用序列化的方式进行克隆
@SuppressWarnings("unchecked") public static <T extends Serializable> T clone(T object) { T cloneObject = null; try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(object); oos.close(); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); cloneObject = (T) ois.readObject(); ois.close(); } catch (Exception e) { e.printStackTrace(); } return cloneObject; }
相关推荐
根据给定文件内容,以下是关于Java设计模式的知识点说明: 1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以...
Java设计模式是软件开发中的一种最佳实践,它总结了在解决特定问题时程序员们经常采用的有效方法。这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的...
原型模式(Prototype Pattern)是一种创建型设计模式,允许通过复制现有对象来创建新对象,而不是通过实例化类来创建新对象。在需要创建大量相似对象时非常有用,它可以避免重复创建对象,从而提高性能,并且可以...
JAVA设计模式-day2,请的行业大能讲得课程,涉及:创建模式(5种: 1、 工厂方法模式(Factory Method); 2、 抽象工厂模式; 3、 单例模式(Singleton) • 4、 建造者模式(Builder); 5、 原型模式(Prototype...
**Java设计模式——入门** 设计模式是软件开发中的一种最佳实践,它是在特定上下文中解决常见问题的经验总结。Java设计模式是面向对象编程中的一个重要概念,可以帮助开发者编写可复用、可维护、易于理解的代码。这...
此外,为了确保参考资料的权威性,建议读者查阅原书《Java设计模式》以获得更加详尽的解释和说明。如果有任何意见或建议,可以通过提供的电子邮箱与作者联系。在学习设计模式的过程中,理解每一个模式的意图、结构、...
**原型设计模式(Prototype Pattern)**是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而不是通过构造函数来实例化新对象。在面向对象编程中,当我们需要频繁地创建具有相同或相似属性的对象时,...
《Java设计模式》是刘伟教授的一本关于设计模式的教材,主要面向高等学校的学生和对Java编程有深入兴趣的开发者。设计模式是软件工程中的一种重要思想,它封装了在特定场景下的问题解决方案,可以提高代码的可读性、...
**Java设计模式之原型模式详解** 原型模式(Prototype Pattern)是设计模式中的一种结构型模式,主要用于快速创建对象。在Java中,它基于对象克隆的概念,允许我们复制已有对象而不必再次创建新实例,从而降低系统...
《Java中的设计模式 - jdon》是一本深入探讨Java编程中设计模式的电子书,它主要聚焦于如何在实际开发中应用和理解这些经典的设计原则和模式。设计模式是软件工程中的一种最佳实践,它总结了在特定上下文中解决常见...
在本设计模式课程设计中,我们重点探讨了五个核心的设计模式:原型模式、单例模式、抽象工厂模式、代理模式和建造者模式。这些模式在Java编程中具有广泛的应用,能够帮助开发者创建更加灵活、可扩展和易于维护的代码...
《Java设计模式实战详解》 在Java编程领域,设计模式是一种通用、可重用的解决方案,用于解决在软件设计中常见的问题。这个压缩包“java-design-patterns-master”显然是一个专注于Java设计模式的学习资源,旨在...
Java设计模式是软件工程中的一种最佳实践,它总结了在特定场景下解决常见问题的经验,为程序员提供了可重用的解决方案。本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与...
本资源“设计模式--java版.rar”提供了一种深入理解和应用Java设计模式的方式。 在Java开发中,设计模式主要分为三大类:创建型模式、结构型模式和行为型模式。创建型模式如单例(Singleton)、工厂方法(Factory ...
" JAVA 设计模式概述" JAVA 设计模式是指在软件设计过程中,为了提高代码的可维护性、灵活性和可扩展性所使用的一些惯用解决方案。JAVA 设计模式可以分为三种:创建模式、结构模式和行为模式。 1. 创建模式 创建...
原型模式是设计模式中的一种,它是Java 23种经典设计模式之一,主要用来提高对象创建的效率。在原型模式中,我们通过复制或克隆一个已经存在的对象来创建新的对象,而不是通过构造函数来创建。这种方法尤其适用于当...