原型模式是创建型模式,用意是:通过给出一个原型对象来指明所要创建的对象类
型,然后用复制这个原型对象的办法创建出更多的同类型对象。
首先要明白 在 java 中 有种说法 叫 深克隆 和 浅克隆,
所谓深浅 ,指的是:
String s1= "zzcfront";
String s2 = s1 ;
上面 是字符串的 浅克隆 ,只是克隆的地址 并没有创建新的对象 。
所以说 :
浅拷贝只拷贝地址,不可拷贝地址指向的东西,因此浅拷贝经常使得两个对象使用同一个地址
而深拷贝则可以从地址中找到内容并拷贝出来,
再将其放到另个地址中以实现拷贝与被拷贝对象之间不存在共用地址的情况
(克隆和拷贝意思相似)
prototype设计模式需要的是深克隆。
深克隆要求:
①为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。
②在派生类中覆盖基类的clone()方法,并声明为public。
③在派生类的clone()方法中,调用super.clone()。
④在派生类中实现Cloneable接口。
明白了克隆 ,那为什么 要 使用原型模式 ?
直白点说 ,我们写了一本书,如果销售的好,需要 n 多本 ,那我们怎么办 ,再重新一本本写
(相当于再一个个new 完然后一个个设置属性),还是 直接拿复印机 复制(相当于clone()),
显然而知吧。
e.g:
(孙悟空战斗时候可以克隆出很多自己)
package com.prototype.monkey;
public abstract class AbstractMonkey implements Cloneable {
// 本类相当于在孙悟空内部,他自造自己的一个地方
public Object clone() {
Object o = null;
try {
o = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return o;
}
public abstract void dothing();
}
package com.prototype.monkey;
public class RealMonkey extends AbstractMonkey {
public void dothing() {
System.out.println("克隆好了真是的自己!去打仗了!");
}
}
package com.prototype.monkey;
public class Test {
public static void main(String[] agrs) {
AbstractMonkey a1 = new RealMonkey();
AbstractMonkey a2 = (AbstractMonkey) a1.clone();
AbstractMonkey a3 = (AbstractMonkey) a1.clone();
// AbstractMonkey a3 = (AbstractMonkey) a2.clone();
// 这里通过 a2 克隆自己也行,说明 a2 已经是一个真实在内
存中的对象了
a1.dothing();
a2.dothing();
a3.dothing();
}
}
Prototype模式的优点包括:
1、Prototype模式允许动态增加或减少产品类。由于创建产品类实例的方法是产批
类内部具有的,因此增加新产品对整个结构没有影响。
2、Prototype模式提供了简化的创建结构。工厂方法模式常常需要有一个与产品类
等级结构相同的等级结构,而Prototype模式就不需要这样。
3、Portotype模式具有给一个应用软件动态加载新功能的能力。由于Prototype的
独立性较高,可以很容易动态加载新功能而不影响老系统。
4、产品类不需要非得有任何事先确定的等级结构,因为Prototype模式适用于任何
的等级结构。
Prototype模式的缺点:
Prototype模式的最主要缺点就是每一个类必须配备一个克隆方法。而且这个克隆
方法需要对类的功能进行通盘考虑,这对全新的类来说不是很难,但对已有的类进
行改造时,不一定是件容易的事。
简单一句话,原型模式就是 “克隆人” 。