设计模式java——原型模式

原型模式(Prototype):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。

new一个对象耗时严重或者需要new很多对象时可以考虑原型模式。

应注意浅克隆和深克隆的问题。

原型模式Demo:

/**
 * 2018年3月27日下午8:11:18
 */
package com.Designpattern;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
 * @author xinwenfeng
 *
 */
public class TestPrototype {

	/**
	 * @param args
	 * @throws CloneNotSupportedException 
	 */
	public static void main(String[] args) throws CloneNotSupportedException {
		PrototypePeople p = new PrototypePeople("雪绒花",22);
		MyPrototype mp = new MyPrototype("无名",p);
		mp.show();
		MyPrototype mp2 = (MyPrototype) mp.clone();
		mp2.show();
		MyPrototype mp3 = mp.deepClone();
		mp3.show();
		System.out.println("============================================");
		MyPrototypeDeep mpd = new MyPrototypeDeep(new PrototypePerson("WZ111"));
		mpd.show();
		MyPrototypeDeep mpd1 = mpd.deepclone();
		mpd1.show();
		
	}

}
class PrototypePeople implements Cloneable{
	private String name;
	private int age;
	public PrototypePeople(String name,int age) {
		this.name = name;
		this.age = age;
	}
	@Override
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
	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;
	}
}
class MyPrototype implements Cloneable{
	private String s;
	private PrototypePeople people;
	public MyPrototype(String s,PrototypePeople people) {
		this.s = s;
		this.people = people;
	}
	public void show() {
		System.out.println(this.toString()+" s="+s+"\npeople= "+people+" p.name:"+people.getName()+" p.age:"+people.getAge());
	}

	//浅克隆(实现Cloneable接口),值类型的会复制,引用类型的只会复制引用不会复制引用对象,两个引用指向同一个对象
	@Override
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
	//深克隆
	protected MyPrototype deepClone() throws CloneNotSupportedException {
		MyPrototype m = (MyPrototype) super.clone();
		m.people = (PrototypePeople) people.clone();
		return m;
	}
}

class PrototypePerson implements Serializable{
	private String name;
	public PrototypePerson(String name) {
		this.setName(name);
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
class MyPrototypeDeep implements Serializable{
	private PrototypePerson person;
	public MyPrototypeDeep(PrototypePerson person) {
		this.person = person;
	}
	public void show() {
		System.out.println(this+"\nperson= "+person+" p.name:"+person.getName());
	}
	//深克隆,序列化实现
	public MyPrototypeDeep deepclone(){
		try {
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			ObjectOutputStream oos = new ObjectOutputStream(baos);
			oos.writeObject(this);
			ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
			ObjectInputStream ois = new ObjectInputStream(bais);
			return (MyPrototypeDeep) ois.readObject();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
}

结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值