目录
Prototype 原型模式
目录
[TOC]
1. 概述
1.1. Head First设计模式定义
当创建给定类的实例的过程很昂贵或很复杂时,就使用原型模式。
1.2. 自我理解
在java中我们知道通过new关键字创建的对象是非常繁琐的(类加载判断,内存分配,初始化等),在我们需要大量对象的情况下,原型模式就是我们可以考虑实现的方式。
原型模式我们也称为克隆模式,即一个某个对象为原型克隆出来一个一模一样的对象,该对象的属性和原型对象一模一样。而且对于原型对象没有任何影响。原型模式的克隆方式有两种:浅克隆和深度克隆。
原型模式 | 说明 |
---|---|
浅克隆 | 只是拷贝本对象,其对象内部的数组、引用对象等都不拷贝,还是指向原生对象的内部元素地址 |
深度克隆 | 深复制把要复制的对象所引用的对象都复制了一遍 |
1.3. 浅拷贝
浅克隆
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。Object类提供的方法clone只是拷贝本对象,其对象内部的数组、引用对象等都不拷贝,还是指向原生对象的内部元素地址
实现
被克隆的对象必须Cloneable,Serializable这两个接口
1.4. 深拷贝
递归对自己引用的对象也进行拷贝
2. Example
3.1. Prototype设计模式的代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
public class PrototypePatternDemo { public static void main(String[] args) throws CloneNotSupportedException { User user = new User(); user.setName("zhangsan"); user.setAge(18); System.out.println(user); User clonedUser = (User) user.clone(); System.out.println(user.equals(clonedUser)); Role role = new Role(); role.setName("管理员"); role.setAuth("增删改查权限"); role.setUser(user); System.out.println(role.toString()); Role clonedRole = (Role) role.clone(); System.out.println(role.equals(clonedRole)); System.out.println(role.getUser().equals(clonedRole.getUser())); } static class User implements Cloneable, Serializable { private String name; private int age; 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; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } @Override public Object clone() throws CloneNotSupportedException{ return super.clone(); } } static class Role implements Cloneable, Serializable { private String name; private String auth; private User user; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuth() { return auth; } public void setAuth(String auth) { this.auth = auth; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public String toString() { return "Role{" + "name='" + name + '\'' + ", auth='" + auth + '\'' + ", user=" + user + '}'; } @Override public Object clone() throws CloneNotSupportedException{ Role clonedRole = (Role) super.clone(); // 深克隆 clonedRole.setUser((User)clonedRole.getUser().clone()); return clonedRole; } } } |
原创文章,转载请注明: 转载自LoserZhao – 诗和远方[ http://www.loserzhao.com/ ]
本文链接地址: http://www.loserzhao.com/java/designpattern/prototype-designpattern.html
文章的脚注信息由WordPress的wp-posturl插件自动生成
0 条评论。