java设计模式---原型模式

来源:互联网 发布:手机淘宝店类目怎么改 编辑:程序博客网 时间:2024/04/29 18:52

用原型实例指定创建对象的种类,并且同过拷贝这些原型创建新的对象。

在java中提供了clone方法来实现对象的克隆,那么先看下clone应满足的条件(要实现克隆该类必需implements Cloneable):

1、对任何对象X,都有X.clone() != X,即克隆对象与原对象不是同一对象,存储的地址也不同;

2、对任何对象X,都有X.clone().getClass() == X.getClass(),即克隆对象与原对象的类型一致;

3、对象X的equals方法定义恰当的话,应该有:X.clone().equals(X) == true;

组成:

抽象原型:实现Cloneable,并且实现了自己的clone。

具体原型:对抽象原型的具体实现(我个人认为没必要)。

类图关系:

具体代码:

抽象原型(我这里只用的普通类):Prototype.java

public class Prototype implements Cloneable {public String name;public String password;public Prototype(String name, String password) {this.name = name;this.password = password;}public void setName(String name) {this.name = name;}public void setPassword(String password) {this.password = password;}public Prototype clone() {Prototype prototype = null;try {prototype = (Prototype)super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();System.out.println("clone failure!!!");}return prototype;}public boolean equals(Object obj) {if(obj instanceof Prototype) {Prototype currPrototype = (Prototype)obj;if(currPrototype.name.equals(this.name) && currPrototype.password.equals(this.password)) {return true;}}return false;}}


客户端:TestPrototype.java

public class TestPrototype {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubPrototype pro = new Prototype("xxx", "xxx123");System.out.println("befor clone--> clone object:" + pro);Prototype pro2 = pro.clone();System.out.println("after clone--> clone object:" + pro2);System.out.println(pro2 == pro);System.out.println(pro2.getClass().equals(pro.getClass()));System.out.println(pro2.equals(pro));}}

运行结果:

当需要更多的该类的对象时,只要使用创建好的对象.clone()就能复制另一个对象。

应用场景:

1、一个系统应该独立于它的产品的创建、构成和表示时;

2、当要实例化的类是在运行时指定(动态加载);

3、需要创建相似的对象比较多的时候。

原创粉丝点击