`
newspringwork
  • 浏览: 99181 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

第一章、Java设计模式-原型模式(Prototype)

 
阅读更多

一、简介

1.定义

一种创建型设计模式,它通过复制一个已经存在的实例来返回新的实例,而不是新建实例,其中被复制的实例就是我们所称的原型。

原型模式的本质:克隆生成对象。

2.什么时候用?

  • 使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。
  • 使用原型模式的另一个好处是简化对象的创建,使得创建对象就像我们在编辑文档时的复制粘贴一样简单。

因为以上优点,所以在需要重复地创建相似对象时可以考虑使用原型模式。比如需要在一个循环体内创建对象,假如对象创建过程比较复杂或者循环次数很多的话,使用原型模式不但可以简化创建过程,而且可以使系统的整体性能提高很多。

 

二、原型模式在Java中的应用

1.Cloneable接口

Java中,我们可以通过实现java.lang.Cloneable接口来实现原型模式。

需要注意的是这里是直接在内存中复制收据,不会调用类的构造方法,而且会破坏单例模式。

2.浅度克隆:

仅仅是值克隆,即原型对象和克隆对象属性的值一样,对于引用类型指向的是同一个对象

3.深度克隆:

值克隆+引用对象的克隆,即引用对象也会进行克隆获得新的对象给对应属性。

4.简单实例

注意:Book中的clone()方法“rtn.setAuthor((Author) this.getAuthor().clone());”如果没有这句,仅仅是浅度克隆,原型对象和克隆对象引用的是同一个Author对象,而这句就是为了实现深度克隆。

public class Author implements Cloneable {
	private String name;
	private int age;

	public String getName() {
		return name;
	}

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

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
}

 

public class Book implements Cloneable {
	private String name;
	private int pageNum;
	private Author author;

	public String getName() {
		return name;
	}

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

	public int getPageNum() {
		return pageNum;
	}

	public void setPageNum(int pageNum) {
		this.pageNum = pageNum;
	}

	public Author getAuthor() {
		return author;
	}

	public void setAuthor(Author author) {
		this.author = author;
	}

	@Override
	public Object clone() throws CloneNotSupportedException {
		Book rtn = (Book) super.clone();
		rtn.setAuthor((Author) this.getAuthor().clone());
		return rtn;
	}
}

 

public class PrototypeTest {
	public static void main(String[] args) throws Exception {
		Author author = new Author();
		author.setName("金庸");
		author.setAge(65);
		Book book = new Book();
		book.setName("射雕英雄传");
		book.setPageNum(230);
		book.setAuthor(author);
		Book newBook = (Book) book.clone();
		System.out.println(newBook == book);
		System.out.println(newBook.getAuthor() == book.getAuthor());
	}
}

 

 

分享到:
评论

相关推荐

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    《java设计模式(第2版)》通过一个完整的java项目对经典著作design patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。本书创造性地将这些模式分为5大类别,以充分展现各个...

    研磨设计模式-part2

    第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) ...

    研磨设计模式-part4

    第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) ...

    研磨设计模式-part3

    第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) ...

    JAVA经典设计模式大全

    3.4 Prototype(原型)—对象创建型 模式 87 3.5 Singleton(单件)—对象创建型 模式 84 3.6 创建型模式的讨论 89 第4章 结构型模式 91 4.1 Adapter(适配器)—类对象结构型 模式 92 4.2 Bridge(桥接)—...

    设计模式文档

    3.4 Prototype(原型)—对象创建型 模式 87 3.5 Singleton(单件)—对象创建型 模式 84 3.6 创建型模式的讨论 89 第4章 结构型模式 91 4.1 Adapter(适配器)—类对象结构型 模式 92 4.2 Bridge(桥接)—对象结构...

    asp.net知识库

    Web标准和ASP.NET - 第一部分 XHTML介绍 在ASP.NET页面中推荐使用覆写(Override)而不是事件处理(Event Handler) 常用编码工具类,支持base64,md5,des,crc32 也谈谈技术面试 在C#里把ArrayList转换为Array 或 把...

    DesignPattern

    #DesignPattern 《研磨设计模式》书中的例子 --第二章:简单工厂 本质:选择实现 --第三章:外观模式(Facade) ...--第十一章:代理模式(Proxy) 本质:控制对象访问 --第十二章:观察者模式(Observer) 本质:触发联动

Global site tag (gtag.js) - Google Analytics