PS1句:终究还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN。由于CSDN也支持MarkDown语法了,牛逼啊!
【工匠若水 http://blog.csdn.net/yanbober】 浏览前1篇《设计模式(创建型)之建造者模式(Builder Pattern)》 http://blog.csdn.net/yanbober/article/details/45338041
要理解原型原型模式必须先理解Java里的浅复制和深复制。有的地方,复制也叫做克隆。Java提供这两种克隆方式。 由于Java中的提供clone()方法来实现对象的克隆,所以Prototype模式实现1下子变得很简单。
浅克隆:被克隆对象的所有变量都含有与原来的对象相同的值,而它所有的对其他对象的援用都依然指向原来的对象。换1种说法就是浅克隆仅仅克隆所斟酌的对象,而不克隆它所援用的对象。
深克隆:被克隆对象的所有变量都含有与原来的对象相同的值,但它所有的对其他对象的援用不再是原本的,而这是指向被复制过的新对象。换言之,深复制把要复制的对象的所有援用的对象都复制了1遍,这类叫做间接复制。
克隆必须满足的条件:
在java中实现clone()应当满足以上3个条件(前两个是必须的,第3个是推荐但不强迫的)。
概念: 使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是1种对象创建型模式。
重点: 原型模式结构重要核心模块:
实现Cloneable接口
在java语言有1个Cloneable接口,它的作用只有1个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。
重写Object类中的clone方法
Java中,所有类的父类都是Object类,Object类中有1个clone方法,作用是返回对象的1个拷贝,但是其作用域protected类型的,1般的类没法调用,因此,Prototype类需要将clone方法的作用域修改成public类型。
创建新对象本钱较大(如初始化需要占用较长的时间,占用太多的CPU资源或网络资源),新的对象可以通过原型模式对已有对象进行复制来取得,如果是类似对象,则可以对其成员变量稍作修改。
如果系统要保存对象的状态,而对象的状态变化很小,或对象本身占用内存较少时,可使用原型模式配合备忘录模式来实现。
需要避免使用分层次的工厂类来创建分层次的对象,并且类的实例对象只有1个或很少的几个组合状态,通过复制原型对象得到新实例可能比使用构造函数创建1个新实例更加方便。
package yanbober.github.io;
//实现Cloneable接口,重写Object类中的clone方法
class MonkeyPrototype implements Cloneable {
@Override
protected MonkeyPrototype clone() throws CloneNotSupportedException {
MonkeyPrototype monkeyPrototype = (MonkeyPrototype) super.clone();
return monkeyPrototype;
}
}
//原型模式实现类
class ConcreteMonkeyPrototype extends MonkeyPrototype {
public void printHasCode() {
System.out.println("ConcreteMonkeyPrototype hascode="+this.hashCode());
}
}
public class Main {
public static void main(String[] args) {
ConcreteMonkeyPrototype type = new ConcreteMonkeyPrototype();
type.printHasCode();
for (int index=0; index<5; index++) {
try {
ConcreteMonkeyPrototype clone = (ConcreteMonkeyPrototype) type.clone();
clone.printHasCode();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
}
运行结果:
ConcreteMonkeyPrototype hascode=356573597
ConcreteMonkeyPrototype hascode=1735600054
ConcreteMonkeyPrototype hascode=21685669
ConcreteMonkeyPrototype hascode=2133927002
ConcreteMonkeyPrototype hascode=1836019240
ConcreteMonkeyPrototype hascode=325040804
使用原型模式复制对象不会调用类的构造方法
由于对象的复制是通过调用Object类的clone方法来完成的,它直接在内存中复制数据,因此不会调用到类的构造方法。不但构造方法中的代码不会履行,乃至连访问权限都对原型模式无效。还记得单例模式吗?单例模式中,只要将构造方法的访问权限设置为private型,就能够实现单例。但是clone方法直接疏忽构造方法的权限,所以,单例模式与原型模式是冲突的,在使用时要特别注意。
原型模式优点以下:
原型模式缺点以下:
【工匠若水 http://blog.csdn.net/yanbober】 继续浏览《设计模式(结构型)之适配器模式(Adapter Pattern)》 http://blog.csdn.net/yanbober/article/details/45338829