入门设计模式之原型

学习更多设计模式请参考:入门设计模式之汇总篇

引言:通过给出一个原型对象来指明所创建的对象的类型,然后复制这个原型对象来创作同类型的对象

Java中使用原型模式必须要满足的条件如下:

1.对于任何对象都有x.clone()!=x 。(也就是说克隆的对象和原先的对象不是一个对象)

2.x.clone().getClass()==x.getClass().(克隆出来的对象跟被克隆的对象是类型一样)

3.x.clone().equals(x)。(克隆对象的属性应该是与被克隆的对象的属性完全一样的)

一个简单的原型模型的类图应该是这样的:

Prototype:抽象接口,所有具体原型类应该实现的接口

User:具体原型类

Client:提出clone请求的客户端角色

PrototypeManage:对clone过程的管理类

public interface Prototype extends Cloneable{
  public Object clone();

  public void setName(String name);

  public String getName();

  public boolean equals(Object obj);

  }
public class User implements Prototype {
     private String name;

  @Override
  public synchronized Object clone() {
      Prototype p=null;
      try {
         p=(Prototype) super.clone();
      } catch (CloneNotSupportedException e) {
          e.printStackTrace();
      }
      return p;
  }

  @Override
  public void setName(String name) {
      this.name=name;
  }
  public String getName(){
      return this.name;
  }
  @Override
  public boolean equals(Object prototype) {
    if(prototype instanceof Prototype){
        if(this.getName()==null&&((Prototype) prototype).getName()==null){
            return true;
        }
        if(this.getName()==null&&((Prototype) prototype).getName()!=null){
            return false;
        }
        if(this.getName()!=null&&((Prototype) prototype).getName()==null){
            return false;
        }
        if(this.getName().equals(((Prototype) prototype).getName())){
            return true;
        }
    }
    return false;
}

}
public class PrototypeManage {
    private Vector vector=new Vector();

    public void add(Prototype p){
        vector.add(p);
    }
    public Prototype get(int i){
       return (Prototype)vector.get(i);
    }
    public int size(){
       return vector.size();
    }
}
public class Client {
    private static Prototype p;
    private static PrototypeManage prototypeManage;

    public static void main(String[] args){
       p=new User();
       p.setName("zhang3");
       prototypeManage=new PrototypeManage();
       Prototype user=(Prototype) p.clone();
       System.out.println(p.equals(user));
       prototypeManage.add(user);

     }
}

执行上述代码我们发现prototypeManage中所管理的user与第一次我们创建的原型对象相比较是符合我们上方定义的三个条件的。

深克隆和浅克隆

在Java中存在这个现象,如果被克隆对象中存在一个Dog类对象dog,克隆出来的对象如果指向的仍然是dog的话,那么这个clone就是浅克隆。如果在此克隆过程中dog也被克隆一份的话那么此次克隆就是深克隆。

原文地址:https://www.cnblogs.com/zhixiang-org-cn/p/9248996.html

时间: 2024-11-03 22:55:22

入门设计模式之原型的相关文章

【设计模式】——原型模式

原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 下图是原型模式的结构图: 原型模型其实就是一个对象再创建另外一个可定制的对象,而且不需任何创建的细节,我们来看看基本的原型模式代码. //原型类 class Prototype { private: string id; public: Prototype(string id) { this->id=id; } string GetId() { return id; } virtual Protot

大话设计模式_原型模式(Java代码)

原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 简单描述:即通过实现接口Cloneable重写方法clone(),使得创建新的拷贝对象不需要一个成员一个成员的重新复制,而且可以提高创建对象的效率 Java中要想实现拷贝使用clone()方法,类必须实现Cloneable接口,并且重写Object类中的clone()方法,调用父类的clone()方法即可实现浅复制 代码如下: WorkExperience类: 1 package com.longsheng.prototy

大话设计模式之原型模式

原型模式 定义: 用原型实例制定创建对象的种类,并通过拷贝这些原型,创建新的对象. 实质: 就是从一个对象在创建另一个可定制的对象,而且不需要知道任何创建的细节. 核心: (1).实现Cloneable接口,可以使用此接口的类上使用clone方法. (2).重写Object类中的clone方法,因为所有类的父类是Object类,Object有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,将clone改为public类型. 结构图: 代

深入浅出设计模式 ------ Prototype(原型模式)之深度克隆

继上篇深入浅出设计模式 ------ Prototype(原型模式)的浅克隆实现, 本文进入Prototype(原型模式)的进阶篇----深度克隆. 深度克隆 ---- 序列化方式实现 把对象写到流里的过程是序列化(Serilization)过程,而把对象从流中读出来的过程则叫做反序列化(Deserialization).写在流里的是对象的一个克隆(新的, 独立的), 而原对象仍存在于JVM内存模型里.因此, 以下代码采用序列化方式实现深度克隆. 第一步: 将上篇的代码做些许改动, 加入对象引用

[入门]打破***的原型,网页中的密码框的密码显示出来

刚才把家里的ADSL的密码给忘记了,好不开心,于是在路由器的配置网页上面找了找去,希望能够找到点蛛丝马迹. 找到PPPoE连接的密码框,可惜它是被***包裹的. 于是掏出开发者工具,找到对应的节点,把type="password"删除即可达到我们的效果. [入门]打破***的原型,网页中的密码框的密码显示出来

设计模式 之 原型

原型模式(Prototype Pattren) 原型模式用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 考试结束了,学校放假了,我们又进入了全职提高班的学习模式: 6:50--起床(当然,年轻人总是爱睡个懒觉,早上总是赖床,有时也会拖到7:00起床) 7:20--去中门买早餐带到机房 12:00--回家吃午饭,然后睡午觉 14:30--又开始了下午的学习 18:00--回家吃晚饭,然后去机房 22:00--回家,洗漱然后睡觉 我们就这样日复一日的生活着,只有周四,才能放松一下自

入门设计模式之桥梁

学习更多设计模式请参考:入门设计模式之汇总篇 桥梁模式:将抽象化与实现化脱藕,使二者可以独立的变化 大家应该对日志记录比较熟悉,不知道有没有自己写过一个日志处理的程序,你又是如何实现的呢? 今天的桥梁模式就根据一下需求来分析一下: 支持2个以上平台 支持2个以上格式 大家可以看一下这个需求哈,2个以上,那我就实现2个呗,一般人可能都会这样想.然后开始写,比如Windows存Txt格式.Windows存Xml格式.Linux存Txt格式的.Linux存Xml格式的,刷刷刷分分钟的就写好了. 但是如

入门设计模式之观察者

学习更多设计模式请参考:入门设计模式之汇总篇 观察者模式:多个观察者对象同时观察一个主题对象,当这个主题对象发生变化时,会通知所有的观察者 来看一下下方类图 Subject:主题类,所有主题的父类,负责对观察者的管理,有添加观察者,删除观察者,通知所有的方法 SubjectImpl:主题子类,拥有状态属性,当状态改变时会调用父类的notifyObserver方法通知所有观察者 Observe:观察者,定义了接受主题变化通知的方法 ObserveImpl:观察者实现类,实现了update()方法用

入门设计模式之合成

学习更多设计模式请参考:入门设计模式之汇总篇 合成模式的职责是将对象组织到树结构中 观察上方类图: interface,一个接口定义了一个获得当前对象名字的方法 leaf:树中的叶子节点,实现了interface Branch:树枝节点,不仅实现了getName方法,同样它本身具有添加节点删除节点的方法且本身可以包含多个树枝节点以及叶子节点 通过上述结论我们可以发现其实合成模式就是树的结构的实现 来看一下代码: public interface Compent { public String g