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

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

  原型模式应用的条件为:创建给定类的实例过程比较复杂,或比较耗时耗资源。因而原型模型主要的目的是为了提高创建对象的效率,隐藏了复杂的创建过程。原型模式还涉及到一个浅复制和深复制的问题,这问题在objective-c更常被提到,java中的说法应该是引用。浅复制只获取了复制对象的指针,与复制对象共享资源,深复制则是获取一个真正地副本对象,享有自己独立的资源。下面是一个小例子,例子中的情况并非需要原型设计模式,只是为了说明一下原型模式的用法。

  首先创建了一个Person类,需要实现Cloneable接口复写clone()方法

package com.cnblogs.ipolaris.test; public class Person implements Cloneable{private String name;private String sex;private int age;public Person(String name,String sex,int age){this.name = name;this.sex = sex;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();}}

  

package com.cnblogs.ipolaris.test; public class PrototypeTest { /*** @param args*/public static void main(String[] args) {Person p1 = new Person("悟空","男",500);Person p2 = p1;try {Person p3 = (Person) p1.clone();System.out.println("p1.name->"+p1.getName()+"\np2.name->"+p2.getName()+"\np3.name->"+p3.getName());p1.setName("八戒");System.out.println("****************************************************");System.out.println("p1.name->"+p1.getName()+"\np2.name->"+p2.getName()+"\np3.name->"+p3.getName());p2.setName("师傅");System.out.println("****************************************************");System.out.println("p1.name->"+p1.getName()+"\np2.name->"+p2.getName()+"\np3.name->"+p3.getName());} catch (CloneNotSupportedException e) {// TODO Auto-generated catch blocke.printStackTrace();} }}

  

  

p2为浅复制,p3为深复制(原型获取),最终的输出结果为

可以看出,浅引用其实是一个对象,使用clone方法获取的为一个新的对象,即通过clone方法实例一个新的对象,此过程中隐藏了对象初始化的细节,当实例化一个对象过于复杂的时候,这种方式就会变得很高效(并不是说所有的情况下,使用原型模式都会提高效率,节省资源开支,但是多数情况下的确如此)。

 

 

转载于:https://www.cnblogs.com/ipolaris/archive/2012/08/26/2657875.html

你可能感兴趣的文章
JDBC为什么要使用PreparedStatement而不是Statement
查看>>
git使用
查看>>
jquery radio取值,checkbox取值,select取值,radio选中,checkbox选中,select选中,及其相关...
查看>>
错误状态码URL重定向
查看>>
离线安装mysql数据库
查看>>
Oracle 数据库导入、导出
查看>>
批量修改 表结构
查看>>
MySQL的btree索引和hash索引的区别
查看>>
抽象类和接口有什么区别
查看>>
wc2018
查看>>
[转载] 杜拉拉升职记——01 忠诚源于满足
查看>>
那些mv*框架如何选择
查看>>
git工作流程
查看>>
Excel坐标自动在AutoCad绘图_3
查看>>
hacknet
查看>>
HTML语义化初探
查看>>
Peaceful Commission 2-sat
查看>>
bzoj3810: [Coci2015]Stanovi(记忆化搜索)
查看>>
azkaban调度
查看>>
11、增强型for循环对二维数组的输出(test8.java)
查看>>