一.介绍
原型模式:就是允许一个对象可以创建另外一个可以定制的对象,根本无需直到任何创建对象的细节,工作原理是:通过将一个原型对象传给另外一个发动创建的对象,这个发送创建的对象通过请求原型对象拷贝它们自己来创建.
在使用了java的clone()方法之后,也就是自己传给自己,自己调用自己,自己复制一个自己
类图
二.代码
public class MainTest {
public static void main(String[] args) {
Concret concret = Concret.getInstance();
Concret clone =(Concret) concret.clone();
System.out.println(clone.str);
}
}
abstract class ProtoType implements Cloneable {
@Override
public ProtoType clone() {
try {
return (ProtoType) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
}
// 使用了单例设计模式
class Concret extends ProtoType {
String str = "a";
private static Concret concret = new Concret();
public static Concret getInstance() {
return concret;
}
private Concret() {}
}
output
false
上述的代码该类为单例设计模式,很明显的原型模式打破了单例设计模式只能创建一个对象的约束.
三.特点
- 扩展性,圆形类是抽线的,它允许其他的类继承本类,又因为每个类的创建由本类自己完成,这样其他的类的添加不影响整个结构;
- 简单,相比较于工厂设计模式,它更简单;
- Prototype模式具有一个给应用软件动态加载新功能的能力,由于它的独立性高,很容易加载新功能而不影响原先的功能;
- 产品类不需要有任何实现确定的等级结构,它适用于任何等级结构;
- 每个类都必须配备一个clone方法,对于新类来说很简单,但是对于已经存在的类进行改造时,不一定是容易的事;
- 高效率,相对于直接new对象,还需要给对象添加状态和属性,我们使用原型模式有更高的效率,不只是在运行效率(直接使用二进制复制对象),还是编码效率(不需要给对象添加属性);
四.实现原理
- 使用原型管理器,体现在一个系统中的原型数目不固定时,可以动态的创建和销毁;
- 实现克隆操作;
- 隔离对象的使用者和具体类型之间的耦合关系,为需要克隆操作的对象提供稳定的接口
五.适用性
- 当一个系统应该独立于它的产品创建,构成和表示时;
- 当要实例化的类是在运行时指定的;
- 为了避免创建一个产品层次的工厂;
- 当一个类的实例只有有几种状态的组合时;
六.总结
- java中的clone方法不使用构造方法,直接在内存中使用二进制的方式复制一份对象出来,所以clone方法不受到构造方法的限制;
- 关于浅克隆与深克隆,本人使用java1.8,在此环境下,java内部实现了深层次的克隆.以后浅克隆也会消失在我们的视线里.注意自己使用java的版本即可;
- 我回顾了下自己的代码,有许多地方,一个for循环中去new对象,我们完全可以使用原型模式来代替这种new对象的方式,当然我们需要实现cloneable接口;
- 许多时候我们已经有了一个类,并且有了继承关系,这个时候往往实现cloneable接口去实现复制功能会更方便和简单,不过这样需要修改本类的原码.
七.参考文献
大话设计模式