第四章:Java设计模式-原型模式

原型模式

简介:是用于创建重复的对象,同时又能保证性能。

           针对于原型实例对象的种类,根据该对象克隆创建一个新对象。

浅克隆

弊端:值类型属性变化时不会影响克隆的对象,引用类型属性变化时会影响克隆对象。

package com.xm.designpattern.prototype;

import java.util.ArrayList;
import java.util.List;

/**
 * java设计模式-原型模式(浅克隆)
 * @author ouyangjun
 */
public class EasyPrototype implements Cloneable {
	
	private String name;
	
	private List<String> list;
	
	public EasyPrototype(){}
	
	public EasyPrototype(String name, List<String> list){
		this.name = name;
		this.list = list;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public List<String> getList() {
		return list;
	}

	public void setList(List<String> list) {
		this.list = list;
	}

	@Override
	protected Object clone() throws CloneNotSupportedException {
		// 直接继承父类克隆
		return super.clone();
	}

	/**
	 * 测试
	 * @param args
	 * @throws CloneNotSupportedException
	 */
	public static void main(String[] args) throws CloneNotSupportedException {
		String name = "ouyangjun";
		List<String> list = new ArrayList<String>();
		list.add("1111");
		list.add("2222");
		
		// 初始化一个对象
		EasyPrototype easy1 = new EasyPrototype(name, list);

		// 克隆一个对象
		EasyPrototype easy2 = (EasyPrototype)easy1.clone();
		
		System.out.println("easy1对象: " + easy1.getName() + " " + easy1.getList());
		System.out.println("easy2对象: " + easy2.getName() + " " + easy2.getList());
		
		System.out.println("------------------------------");
		// 清空集合,重新赋值
		list.clear();
		list.add("8888");
		list.add("9999");
		System.out.println("easy1对象: " + easy1.getName() + " " + easy1.getList());
		System.out.println("easy2对象: " + easy2.getName() + " " + easy2.getList());
		
		// 根据控制台结果可以看出,值类型变量变化时不会影响克隆的对象,引用类型变量变化时会影响克隆对象
	}

}

浅克隆打印效果图如下:

深克隆

package com.xm.designpattern.prototype;

import java.util.ArrayList;

/**
 * java设计模式-原型模式(深克隆)
 * @author ouyangjun
 */
public class DeepPrototype implements Cloneable {
	
	private String name;
	
	// 由于List不能clone, 只能声明ArrayList, 效果是一样的
	private ArrayList<String> arrayList;
	
	public DeepPrototype(){}
	
	public DeepPrototype(String name, ArrayList<String> arrayList){
		this.name = name;
		this.arrayList = arrayList;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public ArrayList<String> getArrayList() {
		return arrayList;
	}

	public void setArrayList(ArrayList<String> arrayList) {
		this.arrayList = arrayList;
	}

	@Override
	protected Object clone() throws CloneNotSupportedException {
		Object object = super.clone();
		
		// 对象克隆
		DeepPrototype deep = (DeepPrototype)object;
		// 属性也克隆
		deep.arrayList = (ArrayList<String>)this.arrayList.clone();
		
		// 返回对象
		return object;
	}

	/**
	 * 测试
	 * @param args
	 * @throws CloneNotSupportedException
	 */
	public static void main(String[] args) throws CloneNotSupportedException {
		String name = "ouyangjun";
		ArrayList<String> arrayList = new ArrayList<String>();
		arrayList.add("1111");
		arrayList.add("2222");
		
		// 初始化一个对象
		DeepPrototype deep1 = new DeepPrototype(name, arrayList);

		// 克隆一个对象
		DeepPrototype deep2 = (DeepPrototype)deep1.clone();
		
		System.out.println("deep1对象: " + deep1.getName() + " " + deep1.getArrayList());
		System.out.println("deep2对象: " + deep2.getName() + " " + deep2.getArrayList());
		
		System.out.println("------------------------------");
		// 清空集合,重新赋值
		arrayList.clear();
		arrayList.add("8888");
		arrayList.add("9999");
		System.out.println("deep1对象: " + deep1.getName() + " " + deep1.getArrayList());
		System.out.println("deep2对象: " + deep2.getName() + " " + deep2.getArrayList());
	}

}

深克隆打印效果图如下:

本章完结,待续!

 

本文说明:该文章属于原创,如需转载,请标明文章转载来源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值