入门设计模式之原型模式

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。博客源地址为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也被克隆一份的话那么此次克隆就是深克隆。


相关文章
|
7月前
|
设计模式 安全 Java
面向对象编程的精髓:Java设计模式 - 原型模式(Prototype)完全参考手册
【4月更文挑战第7天】原型模式是OOP中的创建型设计模式,用于通过复制现有实例创建新实例,尤其适用于创建成本高或依赖其他对象的情况。它包括Prototype接口、ConcretePrototype实现和Client客户端角色。优点是性能优化、避免子类化和动态增加产品族。实现包括定义原型接口、实现具体原型和客户端调用克隆方法。最佳实践涉及确保克隆正确性、选择深拷贝或浅拷贝及考虑线程安全。但需注意克隆方法管理、性能开销和循环引用等问题。在Java中,实现Cloneable接口和覆盖clone方法可实现原型模式。
85 4
|
2月前
|
设计模式 Java
【设计模式】工厂模式(定义 | 特点 | Demo入门讲解)
【设计模式】工厂模式(定义 | 特点 | Demo入门讲解)
62 2
|
2月前
|
设计模式 XML Java
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
34 0
|
2月前
|
设计模式 传感器
【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)
【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)
44 0
|
3月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑】设计模式——原型模式
对比原型模式和传统方式的实现思路、代码方案、优缺点,阐述原型模式的使用场景,以及深拷贝、浅拷贝等相关概念,并扩展原型模式在Spring源码中的应用。
【Java笔记+踩坑】设计模式——原型模式
|
3月前
|
设计模式 Java
Java设计模式-原型模式(3)
Java设计模式-原型模式(3)
Java设计模式-原型模式(3)
|
2月前
|
设计模式 算法 Java
【设计模式】策略模式(定义 | 特点 | Demo入门讲解)
【设计模式】策略模式(定义 | 特点 | Demo入门讲解)
30 0
|
3月前
|
设计模式 C# 开发者
C#设计模式入门实战教程
C#设计模式入门实战教程
|
5月前
|
设计模式
iLogtail设计模式问题之iLogtail中的原型模式是什么
iLogtail设计模式问题之iLogtail中的原型模式是什么
iLogtail设计模式问题之iLogtail中的原型模式是什么
|
5月前
|
设计模式 JavaScript
js设计模式【详解】—— 原型模式
js设计模式【详解】—— 原型模式
53 6