博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
原型模式
阅读量:2434 次
发布时间:2019-05-10

本文共 3024 字,大约阅读时间需要 10 分钟。

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

                 即从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。

 浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所用的对其它对象的引用都仍然指向原来的对象
  深复制:把引用对象的变量指向复制过的新对象,而不是原来被引用的对象。

 

 

/** * 原型接口 * */public  interface Prototype extends Cloneable{			public abstract Prototype copy();		}

 

/** * 地址类,定义为具体类型(拷贝时只复制引用) * */public class Address {		private String id;	private String telephone;	private String address;		public String getId() {		return id;	}	public void setId(String id) {		this.id = id;	}	public String getTelephone() {		return telephone;	}	public void setTelephone(String telephone) {		this.telephone = telephone;	}	public String getAddress() {		return address;	}	public void setAddress(String address) {		this.address = address;	}}

 

/** * 部门类(实现原型类方法,提供深拷贝) * */public class Department implements Prototype{			private String id;	// 部门名称	private String name;	public Prototype copy() {				Department department = null;		try {			department = (Department)this.clone();		} catch (CloneNotSupportedException e) {			e.printStackTrace();		}		return department;	}	public String getId() {		return id;	}	public void setId(String id) {		this.id = id;	}	public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}}

 

/** * 具体的原型类1 * */public class ConcretePrototype1 implements Prototype {		// 姓名	private String name;		// 地址	private Address address;		// 部门	private Department department;	public Prototype copy() {					Prototype prototype = null;		try {						// 调用clone()方法时,必须实现java.lang.Cloneable接口			prototype = (Prototype)this.clone();		} catch (CloneNotSupportedException e) {			e.printStackTrace();		}		return prototype;	}	public void setName(String name) {		this.name = name;			}	public String getName() {		return name;	}	public Address getAddress() {		return address;	}	public void setAddress(Address address) {		this.address = address;	}	public Department getDepartment() {		return department;	}	public void setDepartment(Department department) {				// 此处为引用类型department的深拷贝		this.department = (Department)department.copy();	}}

 

public class Main {	public static void main(String[] args) {				ConcretePrototype1 c1 = new ConcretePrototype1();		c1.setName("C1");		Address address = new Address();		address.setTelephone("1359978768");		address.setAddress("厦门");		c1.setAddress(address);		Department department = new Department();		department.setName("开发部");		c1.setDepartment(department);				ConcretePrototype1 copyC1 =(ConcretePrototype1) c1.copy();		System.out.println(copyC1.getName());		System.out.println(copyC1.getAddress().getAddress());				// c1的改变不会影响copyC1的变化		c1.setName("C2");			System.out.println(copyC1.getName());//输出仍为C1				// 此时c1的改变会影响copyC1的变化,因为clone()实现的是浅拷贝,address为引用类型,只复制引用		address.setAddress("北京");		c1.setAddress(address);		System.out.println(copyC1.getAddress().getAddress());//输出变为北京				//此时c1的改变不会影响copyC1的变化,因为Department引用类型实现了深拷贝。		department.setName("总经理室");		c1.setDepartment(department);		System.out.println(copyC1.getDepartment().getName());//输出仍为开发部			}}

 

输出结果为:

 

C1厦门C1北京开发部

 

转载地址:http://ayxmb.baihongyu.com/

你可能感兴趣的文章
HashMap的remove()方法详解
查看>>
单例模式-分解步骤,逐步解析
查看>>
通过Form表单一次性拿到json格式数据,及后台接收
查看>>
## EL表达式与JSTL标签用法解读
查看>>
Mybatis异常:The content of elements must consist of well-formed.......(一般出现在写分页/带大于小于号的SQL)
查看>>
Mybatis光速入门(配置文件模块)
查看>>
关于Oracle的主键自增如何设置
查看>>
手撕HashMap的resize()方法源码渗透解析+图解
查看>>
Mybatis常见异常类型Could not set parameters for mapping离不开这个原因!
查看>>
Thymeleaf中一个页面怎么嵌套另一个页面,关于页面嵌套,标签告诉你应该知道的
查看>>
JAVA如何实现短信验证码--阿里云接口,新手式图文教学,个人项目有这一篇就够了
查看>>
Java中大小数BigDecimal的加减乘除用法及场景的详细介绍,看完不信你还会报Syntax error on token “+/-/*“, invalid AssignmentOperat异常
查看>>
UVa 10917 Dijkstra
查看>>
CF403B/CF402D
查看>>
CF402E / 403C
查看>>
cf404b
查看>>
cf404c
查看>>
cf404d
查看>>
武大网络预赛 Problem 1537 - A - Stones I
查看>>
武大网络预赛 Problem 1545 - I - Twenty-four
查看>>