欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA设计模式学习9——原型模式

程序员文章站 2022-05-03 18:43:19
...

原型模式(prototype)它是指通过给定一个原型对象来指明所要创建的对象类型,然后复制这个原型对象的办法创建出同类型的对象。原型模式也属于创建模式。

我们先来看一下原型模式的模型:

JAVA设计模式学习9——原型模式
            
    
    博客分类: 设计模式 原型模式 

原型模型涉及到三个角色:

客户角色(client):客户端提出创建对象的请求;

抽象原型(prototype):这个往往由接口或者抽象类来担任,给出具体原型类的接口;

具体原型(Concrete prototype):实现抽象原型,是被复制的对象;

模拟代码如下:

 

package prototype;
/**
 * 
 *作者:alaric
 *时间:2013-7-18下午10:40:49
 *描述:抽象接口
 */
public interface Prototype extends Cloneable {

	public Object clone();
	
}

 

package prototype;
/**
 * 
 *作者:alaric
 *时间:2013-7-18下午10:41:39
 *描述:实现接口
 */
public class ConcretePrototype implements Prototype {

	@Override
	public Object clone() {
		try {
			return  super.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
		
	}	

}

 

 

package prototype;
/**
 * 
 *作者:alaric
 *时间:2013-7-18下午10:41:14
 *描述:客户端
 */
public class Client {
	private Prototype prototype;
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Client c = new Client();
		c.prototype = c.getNewPrototype(new ConcretePrototype());

	}
	/**
	 * 
	 * @param prototype
	 * @return
	 */
    public Prototype getNewPrototype(Prototype prototype){
    	return (Prototype) prototype.clone();
    }
}

 以上代码简单描述了原型模式的实现,说到这里估计很多人要跳了,因为说到原型模式不能不说的问题是java的深拷贝和浅拷贝,那下面我们就来讨论下深拷贝和浅拷贝。

浅拷贝:是指拷贝引用,实际内容并没有复制,改变后者等于改变前者。

深拷贝:拷贝出来的东西和被拷贝者完全独立,相互没有影响。

引用一哥们举的例子(博客地址忘记了)

有一个人叫张三,人们给他取个别命叫李四,不管张三还是李四都是一个人,张三胳膊疼,李四也是一个样的不爽。这个就是浅拷贝,只是个别名而已。

同样还是有一个人叫张三,通过人体克隆技术(如果法律允许)得到一个李四,这个李四和被克隆的张三完全是两个人,张三就是少个胳膊,李四也不会感到疼痛。这个就是深拷贝。

 

java语言提供Cloneable接口,在运行时通知虚拟机可以安全的在这个类上使用clone()方法,通过这个方法可以复制一个对象,但是Object并没有实现这个接口,所以在拷贝是必须实现此标识接口,否则会抛出CloneNotSupportedException。

但是clone()方法出来的默认都是浅拷贝,如果要深拷贝,那么可以考虑自己编写clone方法,但是深度很难控制,编写这个clone方法也不是最佳方案,还有个比较好的方案就是串行化来实现,代码如下:

public Object deepClone(){
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    ObjectOutputStream oos = new ObjectOutputStream(bos); 
    oos.writeObject(this); 
    ByteArrayInputStream bis = new ByteArrayInputStream(baos.toByteArray()) 
    ObjectInputStream ois = new ObjectInputStream(bis); 
    return ois.readObject();
}

这样就可以实现深拷贝,前提是对象实现java.io.Serializable接口。

 

注意:除了基本数据类型外,其他对象默认拷贝都是浅拷贝,String类型是个例外,虽然是基本类型,但是也是浅拷贝,这个跟它实际在java内存存储情况有关。超出了设计模式讨论范围,大家可自行查看相关资料。

 

 

 

设计模式系列目录:

JAVA设计模式学习1——统一建模语言UML

JAVA设计模式学习2——面向对象设计原则

JAVA设计模式学习3——设计模式概述

JAVA设计模式学习4——简单工厂模式

JAVA设计模式学习5——工厂方法模式

JAVA设计模式学习6——抽象工厂模式

JAVA设计模式学习7——单例模式

JAVA设计模式学习8——建造模式

JAVA设计模式学习9——原型模式

JAVA设计模式学习10——组合模式

JAVA设计模式学习11——适配器模式

JAVA设计模式学习12——装饰器模式

JAVA设计模式学习13——代理模式

JAVA设计模式学习14——享元模式

JAVA设计模式学习15——门面模式

JAVA设计模式学习16——桥梁模式

JAVA设计模式学习17——策略模式

JAVA设计模式学习18——模版方法模式

JAVA设计模式学习19——观察者模式

JAVA设计模式学习20——责任链模式

JAVA设计模式学习21——命令模式

JAVA设计模式学习22——备忘录模式

JAVA设计模式学习23——状态模式

JAVA设计模式学习24——访问者模式

JAVA设计模式学习25——迭代器模式

  • JAVA设计模式学习9——原型模式
            
    
    博客分类: 设计模式 原型模式 
  • 大小: 8.3 KB
相关标签: 原型模式