java设计模式(四):原型模式

一:原型模式

 原型模式适用于对于一个已有的对象进行复制,复制之后在进行修改等等,在大量使用循环创建对象,并且赋值差不多的情况下该方式就体现出极大的优势来。原型模式原理还是基于java中克隆,而java中的克隆分为2种浅克隆和深克隆。

 浅克隆:浅克隆是指克隆了原对象的数据类型,浅克隆只适用于一些基本的数据类型。不会克隆引用的对象

深克隆: 可科隆引用对象

 

二:浅克隆解析

 1.只有基本数据类型的浅克隆

     浅克隆适用于基础数据类型的克隆。由于基本数据类型只存在栈地址(String除外),因此使用==返回的都是true,而String类型由于其存在一个String的常量池,导致其使用==也是相等的。

package com.xncoding.pos;



//可以被克隆的对象,必须实现cloneable接口
public class User  implements Cloneable {
	
	private String userName;
	
	private Integer age;
	
	private Integer sex;
	
	
	
		

	
	
	
	
	public String getUserName() {
		return userName;
	}




	public void setUserName(String userName) {
		this.userName = userName;
	}




	public Integer getAge() {
		return age;
	}




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




	public Integer getSex() {
		return sex;
	}




	public void setSex(Integer sex) {
		this.sex = sex;
	}




	



	




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

	

	
	public static void main(String[] args) throws CloneNotSupportedException {
		//浅克隆,适用于只有基础数据类型的对象,其应用的地址都是一致。
		User u1=new User();
		u1.setUserName("A");
		u1.setAge(11);
		u1.setSex(1);
		
		
			//====当被克隆的对象中有引用类型时
		User u2=(User) u1.clone();		
		System.out.println(u2.getUserName()==u1.getUserName());
		
	}
	
	
	
}

 2.含有引用类型的浅克隆

       含有引用类型的数据(String除外),在克隆时,是不会科隆引用类型的对象的数据的,这里就得采用深克隆

package com.xncoding.pos;

public class Book  implements Cloneable{

	private String bookName;

	public String getBookName() {
		return bookName;
	}

	public void setBookName(String bookName) {
		this.bookName = bookName;
	}
	
	@Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
	
	
	public static void main(String[] args) {
		
	}
}
package com.xncoding.pos;



//可以被克隆的对象,必须实现cloneable接口
public class User  implements Cloneable {
	
	private String userName;
	
	private Integer age;
	
	private Integer sex;
	
	
	private Book  book;
		

	
	
	
	
	public String getUserName() {
		return userName;
	}




	public void setUserName(String userName) {
		this.userName = userName;
	}




	public Integer getAge() {
		return age;
	}




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




	public Integer getSex() {
		return sex;
	}




	public void setSex(Integer sex) {
		this.sex = sex;
	}




	public Book getBook() {
		return book;
	}




	public void setBook(Book book) {
		this.book = book;
	}




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

	

	
	public static void main(String[] args) throws CloneNotSupportedException {
		//浅克隆,适用于只有基础数据类型的对象,其应用的地址都是一致。
		User u1=new User();
		u1.setUserName("A");
		u1.setAge(11);
		u1.setSex(1);
		Book book=new Book();
		book.setBookName("6bs");
		
			//====当被克隆的对象中有引用类型时,引用类型不会被克隆过来
		User u2=(User) u1.clone();		
		System.out.println(u2.getUserName()==u1.getUserName());
		System.out.println(u2.getBook());
	}
	
	
	
}

三:深克隆

package com.xncoding.pos;

public class Book  implements Cloneable{

	private String bookName;

	public String getBookName() {
		return bookName;
	}

	public void setBookName(String bookName) {
		this.bookName = bookName;
	}
	
	@Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
	
	
	
}
package com.xncoding.pos;



//可以被克隆的对象,必须实现cloneable接口
public class User  implements Cloneable {
	
	private String userName;
	
	private Integer age;
	
	private Integer sex;
	
	
	private Book  book;
		

	
	
	
	
	public String getUserName() {
		return userName;
	}




	public void setUserName(String userName) {
		this.userName = userName;
	}




	public Integer getAge() {
		return age;
	}




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




	public Integer getSex() {
		return sex;
	}




	public void setSex(Integer sex) {
		this.sex = sex;
	}




	public Book getBook() {
		return book;
	}




	public void setBook(Book book) {
		this.book = book;
	}




	@Override
    protected Object clone() throws CloneNotSupportedException {
        User user=(User) super.clone();
        user.setBook((Book)book.clone());
        return user;
    }

	

	
	public static void main(String[] args) throws CloneNotSupportedException {
		
		User u1=new User();
		u1.setUserName("A");
		u1.setAge(11);
		u1.setSex(1);
		Book book=new Book();
		book.setBookName("6bs");
		u1.setBook(book);
			
		User u2=(User) u1.clone();		
		System.out.println(u2.getUserName()==u1.getUserName());
		System.out.println(u2.getBook().getBookName() == u1.getBook().getBookName());
		
		
		
		
	}
	
	
	
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值