当前位置:首页 > 开发 > 编程语言 > 设计模式 > 正文

读《研磨设计模式》-代码笔记-原型模式

发表于: 2012-08-21   作者:bylijinnan   来源:转载   浏览:
摘要: 声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ /** * Effective Java 建议使用copy constructor or copy factory来代替clone()方法: * 1.public Product copy(Product p){} * 2.publi
声明:
本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/




/**
 * Effective Java 建议使用copy constructor or copy factory来代替clone()方法:
 * 1.public Product copy(Product p){}
 * 2.public static Product newInstance(Product p){} 
 */
public class PrototypePattern {

	private Product product;
	
	public PrototypePattern(Product product) {
		this.product = product;
	}
	
	public void saveProduct() {
		Product product2 = (Product) product.clone();
		System.out.println("Product Name before save:" + product2.getName());
		product2.setName("newProductName");
		System.out.println("Product Name after save:" + product2.getName());
		Label label2 = product2.getLabel();
		label2.setName("newLabelName");
	}
	
	public static void main(String[] args) {
		Label label = new Label();
		label.setName("labelName");
		Product product = new Product();
		product.setName("productName");
		product.setLabel(label);
		PrototypePattern client = new PrototypePattern(product);
		client.saveProduct();
		System.out.println("original product name is " + product.getName());
		System.out.println("original label name is " + product.getLabel().getName());
		
	}

}

/*
 * 1、java.lang.Cloneable是个空接口
 * 如果你不实现这个接口的话,调用clone方法的时候会出现CloneNotSupportedException
 * 2、clone()方法是Object的方法
 */
class Label implements Cloneable{
	
	private String name;
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Object clone() {
		Object object = null;
		try {
			object = super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return object;
	}
}

class Product implements Cloneable{
	
	private Label label;
	
	private String name;
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public Label getLabel() {
		return label;
	}

	public void setLabel(Label label) {
		this.label = label;
	}
	
	//override Object的clone方法。手工克隆所有的field
	public Product clone() {
		Product p = new Product();
		p.setName(name);
		p.setLabel((Label)label.clone());	//深度克隆
		return p;
	}
	
	/*
	//也可这样写
	public Object clone() {
		Product other = null;
		try {
			
			//这一步是shallow copy。自动把name属性复制了。name是String类型,是"immutable object",否则就要像复制Label那样来复制
			other = (Product)super.clone();		
			
			//下面的操作不可少,否则新旧的Product里面的Label是同一个
			//而Label是mutable object,一个Product调用getLabel().setName()会影响到另一个Product
			other.label = (Label) this.label.clone();		
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return other;
	}
	*/
}

读《研磨设计模式》-代码笔记-原型模式

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
本节课程概览 学习抽象工厂模式 一:初识抽象工厂模式 包括:定义、结构、参考实现 二:体会抽象工
定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 类型:创建类模式 类图:
原型模式(prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 原型
9.2 解决方案 9.2.1 原型模式来解决 用来解决上述问题的一个合理的解决方案就是原型模式。那么什么
9.3 模式讲解 9.3.1 认识原型模式 (1 )原型模式的功能 原型模式的功能实际上包含两个方面: 一个
原型模式也是很简单的一种模式,对于java来说已经有相应的接口了(Cloneable)。关于原型模式<&l
引子   古人云:书非借不能读也。    现在 IT 书籍更新快、价格贵、质量水平更是参差不齐,实
http://zz563143188.iteye.com/blog/1847029 原型模式(Prototype) 原型模式虽然是创建型的模式,但
设计模式-原型模式 效果: 原型模式,其实就是完整的复制一个对象,以一个对象为样本,进行复制作业,然
前言 点击查看:设计模式系列 原型模式(Prototype) 理解:原型模式属于创建型模式,与工厂,单件
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号