入门设计模式之原型模式

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。博客源地址为zhixiang.org.cn https://blog.csdn.net/myFirstCN/article/details/80866285 学习更多设计模式请参考:入门设计模式之汇总篇引言:通过给出一个原型对象来指明所创建的对象的类型,然后复制这个原型对象来创作同类型的对象Java中使用原型模式必须要满足的条件如下:1.对于任何对象都有x.clone()!=x 。
版权声明:本文为博主原创文章,未经博主允许不得转载。博客源地址为zhixiang.org.cn https://blog.csdn.net/myFirstCN/article/details/80866285


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


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


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也被克隆一份的话那么此次克隆就是深克隆。


相关文章
|
2月前
|
设计模式 安全 Java
【设计模式】原型模式
【设计模式】原型模式
|
3月前
|
设计模式 Java 关系型数据库
23种设计模式 —— 原型模式【克隆羊、浅拷贝、深拷贝】
23种设计模式 —— 原型模式【克隆羊、浅拷贝、深拷贝】
|
5月前
|
设计模式 Java
Java设计模式【五】:原型模式
Java设计模式【五】:原型模式
18 0
|
5月前
|
设计模式 存储
二十三种设计模式全面解析-原型模式进阶之原型管理器:集中管理对象原型的设计模式之道
二十三种设计模式全面解析-原型模式进阶之原型管理器:集中管理对象原型的设计模式之道
|
4月前
|
设计模式 监控 安全
多线程设计模式【多线程上下文设计模式、Guarded Suspension 设计模式、 Latch 设计模式】(二)-全面详解(学习总结---从入门到深化)
多线程设计模式【多线程上下文设计模式、Guarded Suspension 设计模式、 Latch 设计模式】(二)-全面详解(学习总结---从入门到深化)
62 0
|
20天前
|
设计模式 Java
【设计模式系列笔记】原型模式
原型模式(Prototype Pattern)是一种创建型设计模式,其主要目的是通过复制现有对象来创建新对象,而无需知道其具体类型。这种模式属于对象创建型模式,通过克隆来避免使用new关键字创建对象,提高性能和降低系统的耦合度。
32 6
|
29天前
|
设计模式 Java
小谈设计模式(10)—原型模式
小谈设计模式(10)—原型模式
|
1月前
|
设计模式 Java
23种设计模式,原型模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新的对象,而无需知道如何创建的细节。这种模式的核心思想是基于一个原型实例,通过复制这个原型来创建新的对象
25 7
|
2月前
|
设计模式 Java
设计模式之原型模式
设计模式之原型模式
|
4月前
|
设计模式 存储 JSON
Java设计模式-原型模式
原型模式也是创建对象的一种方式,它一般用在这样的场景:系统中存在大量相同或相似对象的创建问题,如果用传统的构造函数来创建对象,会比较复杂而且耗费资源。这个时候使用原型模式的克隆方式,能够节省不少时间。比如Java 类中提供的`Object clone()`就是原型模式的应用。
31 1
Java设计模式-原型模式