原型模式
来源:互联网 发布:势不可挡网络剧预告片 编辑:程序博客网 时间:2024/06/07 15:41
定义
- 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
优点
- 性能提高
- 避免构造函数的约束
缺点
- 配备克隆方法,需要对类的功能进行通盘考虑
- 必须继承Cloneable接口
- 避免构造函数的约束
注意事项
- 原型模式是通过拷贝一个现有对象生成新对象的。
- 浅拷贝实现Cloneable,重写,深拷贝是通过实现Serializable读取二进制流
第一步(最简单的)
public class Person implements Cloneable{ private String name; private int age; private double height; private double weight; 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; } public double getHeight() { return height; } public void setHeight(double height) { this.height = height; } public double getWeight() { return weight; } public void setWeight(double weight) { this.weight = weight; } @Override public String toString() { return "Person : " + "name -- " + name + ",age -- " + age + ",height -- " + height + ",weight -- " + weight; } @Override protected Object clone() throws CloneNotSupportedException { Person person = null; person = (Person)super.clone(); person.name = this.name; person.age = this.age; person.height = this.height; person.weight = this.weight; return person; }}
第二步(最简单的)
public class PrototypDemo { public static void main(String[] args) throws CloneNotSupportedException { Person p = new Person(); p.setName("张三"); p.setAge(18); p.setHeight(175d); p.setWeight(75d); System.out.println("最初的数据:"); System.out.println(p); Person p1 = (Person) p.clone(); System.out.println("第一次clone之后的数据:" ); System.out.println(p1); p1.setName("李四"); System.out.println("clone之后的第一次的数据:" ); System.out.println(p); System.out.println("clone之后修改后的数据:"); System.out.println(p1); }}
收获结果
最初的数据:Person : name -- 张三,age -- 18,height -- 175.0,weight -- 75.0第一次clone之后的数据:Person : name -- 张三,age -- 18,height -- 175.0,weight -- 75.0clone之后的第一次的数据:Person : name -- 张三,age -- 18,height -- 175.0,weight -- 75.0clone之后修改后的数据:Person : name -- 李四,age -- 18,height -- 175.0,weight -- 75.0
第一步(Person类增加list)
private ArrayList<String> hobbies = new ArrayList<>();public ArrayList<String> getHobbies() { return hobbies;}public void setHobbies(ArrayList<String> hobbies) { this.hobbies = hobbies;}protected Object clone() throws CloneNotSupportedException { Person person = null; person = (Person)super.clone(); person.name = this.name; person.age = this.age; person.height = this.height; person.weight = this.weight; person.hobbies = (ArrayList<String>) this.hobbies.clone(); return person; }
第二步(验证)
public class PrototypDemo { public static void main(String[] args) throws CloneNotSupportedException { Person p = new Person(); p.setName("张三"); p.setAge(18); p.setHeight(175d); p.setWeight(75d); ArrayList<String> hobbies = new ArrayList<>(); hobbies.add("敲代码"); hobbies.add("编程"); p.setHobbies(hobbies); System.out.println("最初的数据:"); System.out.println(p); Person p1 = (Person) p.clone(); System.out.println("第一次clone之后的数据:" ); System.out.println(p1); p1.setName("李四"); p1.getHobbies().add("睡觉"); System.out.println("clone之后的第一次的数据:"); System.out.println(p); System.out.println("clone之后修改后的数据:"); System.out.println(p1); }}
查看结果
最初的数据:Person : name -- 张三,age -- 18,height -- 175.0,weight -- 75.0,hobbies -- 敲代码,编程,第一次clone之后的数据:Person : name -- 张三,age -- 18,height -- 175.0,weight -- 75.0,hobbies -- 敲代码,编程,clone之后的第一次的数据:Person : name -- 张三,age -- 18,height -- 175.0,weight -- 75.0,hobbies -- 敲代码,编程,clone之后修改后的数据:Person : name -- 李四,age -- 18,height -- 175.0,weight -- 75.0,hobbies -- 敲代码,编程,睡觉,
阅读全文
0 0
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型 模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 原型模式
- 脚本优化
- 数据结构第七周项目(一)——建立顺序环形队列算法库
- phpstorm 输入法中文不同步 phpstorm 输入法不跟随光标解决办法 win7系统新安装的phpstorm2017.2版本,试了很多输入法,要么是不显示候选次,要么是输入法候选词总是在屏幕右
- 使用showdown.js将Markdown文档转换为HTML
- Palisade.Decision.Tools.Suite.Industrial.v5.5 1CD(不确定性定量分析与决策)
- 原型模式
- C语言小记
- 【人工智能】动物、植物、车型、菜品、LOGO识别示例代码
- 自学OPENCV+PYTHON+MACOS-X(2)
- 图片的三级缓存
- 计算一段代码执行时间
- es索引管理工具——curator
- HTTP协议详解——压缩问题
- 亿级Web系统的容错性建设实践