原型模式
来源:互联网 发布:python 热力地图 编辑:程序博客网 时间:2024/06/07 10:55
原型模式
原型模式结构图:
原型模式结构图代码解析:
/** * Created by 杨Sir on 2017/11/17. * 原型模式接口,,如果单纯是行为,使用接口最好 * 如果涉及到共性的属性,则使用抽象类最好。 需要自己权衡。 */public interface Prototype extends Cloneable { public Prototype clone() throws CloneNotSupportedException;}
/** * Created by 杨Sir on 2017/11/17. */public class ConcretePrototype implements Prototype{ private String name; public ConcretePrototype() { } public ConcretePrototype(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public Prototype clone() throws CloneNotSupportedException { return (Prototype) super.clone(); } @Override public String toString() { return "ConcretePrototype{" + "name='" + name + '\'' + '}'; }}
/** * Created by 杨Sir on 2017/11/17. */public class Main { public static void main(String[] args) throws CloneNotSupportedException { Prototype prototype = new ConcretePrototype("张三"); /** * 注意对象如果向上转型为接口类型,就只能调用接口定义的方法,子类的所有自定义方法不能调用 * 但是可以在使用该子类时将子类向下转型。 */ Prototype prototypeClone = prototype.clone(); //为了修改子类的一些属性值,调用实现类的方法,需要向下转型。 ConcretePrototype prototypeClone1 = null; if(prototype instanceof ConcretePrototype){ prototypeClone1 = (ConcretePrototype) prototype; } prototypeClone1.setName("lisi"); System.out.println(prototype); System.out.println(prototypeClone); }}
原型模式主要用于对象的复制,其核心就是Proptotype类。在Java中Prototype需要具备两个条件:
①. 实现 Cloneable接口。它的作用就是在运行时告知虚拟机可以安全的实现 此接口实现类上的clone().
②. 重写Object类的 clone()方法,该方法返回一个对象的拷贝。注意重写时将方法的访问修饰符改为 public
在实际开发过程中,原型模式一般会和其他模式混用。
原型模式的优点:
一般在初始化的信息不发生变化的情况下,克隆是最好的创建对象的办法。这隐藏了对象创建的细节,对性能也大有很大提高,比如大对象的创建,循环创建相同类型对象等。
原型模式要注意的地方:
原型模式复制对象不会调用类的构造方法,因为不会调用构造方法,所以不管你构造方法访问权限是什么,都无所谓。因此这就与单例模式产生了冲突,使用时需要注意。
深复制与潜复制
如果被复制对象的字段是值类型的(这里包括8中基本数据类型、他们的包装类型、String),则对该字段执行逐位复制,如果是引用类型,只复制对象的引用而不复制对象本身。因此原始对象与其复本引用同一对象。
深复制把引用对象的变量指向复制过的对象,而不是指向原来被引用的对象。
具体的深复制和浅复制我在另一篇博客《Java深复制与浅复制》中有详细解释。
阅读全文
0 0
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型 模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- Kubernetes controller-manager中deployment处理流程源码分析
- SVM多分类问题 libsvm在matlab中的应用
- 小结
- 快速删除docker中的容器
- 抛出异常的特点
- 原型模式
- 51nod 1052 最大M子段和
- SQL之存储过程与触发器
- Extjs3.0角色权限管理系统-用户管理模块篇
- 九、微信登录与令牌
- Oracle基础知识5 : 多表查询1
- JS兼容问题的函数封装文档
- 以后可能会接触的技术(只是记录读书遇到的)
- 汉诺塔问题