Java 原始模型(Prototype)模式

时间:2023-03-08 15:35:18

一、什么是原型模式:

通过给出一个原型对象指明所要创建的对象的类型,然后通过复制这个原型对象来获取的更多的同类型的对象。

在Java语言中,支持原型模式,所有的对象都继承自Object对象,Object类提供一个clone()方法,它可以将JavaBean复制一份。所有要复制对象的类都要继承Cloneble接口,并实现继clone()方法才可以通过复制来获取自身更过的对象。如果一个对象没有实现Cloneble接口,则会抛出CloneNotSupportedException异常。

二、原型模型结构示意图:

Java 原始模型(Prototype)模式

  实现clone()方法;继承Colneable接口。

三、克隆模型的特点:

  1.克隆对象与原对象不是一个对象。

  2.克隆对象与原对象的类型是一个类型。

  3.如果equal方法重载继承重写,x.clone().equal(x)结果为true。

 /**
* 一个商品类
*
* @author ZhouDX
* @since 2019/3/14 22:16:15
*/
public class Product implements Cloneable {
/**
* 构造函数
*/
public Product(String prouductId, String prouductName, String price) {
this.prouductId = prouductId;
this.prouductName = prouductName;
this.price = price;
} /**
* 构造函数
*/
public Product(String prouductId, String prouductName) {
this.prouductId = prouductId;
this.prouductName = prouductName;
this.price = "0";
} /**
* 商品id
*/
private String prouductId;
/**
* 商品id
*/
private String prouductName;
/**
* 价格
*/
private String price; public String getProuductId() {
return prouductId;
} public void setProuductId(String prouductId) {
this.prouductId = prouductId;
} public String getProuductName() {
return prouductName;
} public void setProuductName(String prouductName) {
this.prouductName = prouductName;
} public String getPrice() {
return price;
} public void setPrice(String price) {
this.price = price;
} @Override
protected Object clone() {
Product productClone = new Product(prouductId, prouductName);
productClone.setPrice(price); return productClone;
} @Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Product)) {
return false;
}
Product product = (Product) o;
return Objects.equals(getProuductId(), product.getProuductId()) && Objects.equals(getProuductName(), product.getProuductName()) && Objects.equals(getPrice(), product.getPrice());
} @Override
public String toString() {
return "Product{" + "prouductId='" + prouductId + '\'' + ", prouductName='" + prouductName + '\'' + ", price='" + price + '\'' + '}';
} public static void main(String[] args) {
Product product = new Product("201903142226", "钢铁侠", "500"); Product productClone = (Product) product.clone(); System.out.println("productClone:\n" + productClone);
System.out.println("product==productClone?:" + product.equals(productClone));
System.out.println("product.getClass()==productClone.getClass()?:" + product.getClass().equals(productClone.getClass()));
System.out.println("product.clone().equals(product)?"+product.clone().equals(product));
}
}

  运行结果:

Java 原始模型(Prototype)模式

三、原始模型的分类:

简单原始模型:

Java 原始模型(Prototype)模式

Prototype(抽象原始模型角色):抽象类或者一个接口,给出具体模型需要的接口。

ConcretePrototype(具体原始模型角色):继承抽象原型模型角色,被复制的对象。

Client(客户端):提出复制请求。

/**
* 抽象原始模型角色
*
* @author ZhouDX
* @since 2019/3/14 22:12:10
*/
public interface Prototype extends Cloneable { Prototype clone();
}