一、什么是原型模式:
通过给出一个原型对象指明所要创建的对象的类型,然后通过复制这个原型对象来获取的更多的同类型的对象。
在Java语言中,支持原型模式,所有的对象都继承自Object对象,Object类提供一个clone()方法,它可以将JavaBean复制一份。所有要复制对象的类都要继承Cloneble接口,并实现继clone()方法才可以通过复制来获取自身更过的对象。如果一个对象没有实现Cloneble接口,则会抛出CloneNotSupportedException异常。
二、原型模型结构示意图:
实现clone()方法;继承Colneable接口。
三、克隆模型的特点:
1.克隆对象与原对象不是一个对象。
2.克隆对象与原对象的类型是一个类型。
3.如果equal方法重载继承重写,x.clone().equal(x)结果为true。
1 /** 2 * 一个商品类 3 * 4 * @author ZhouDX 5 * @since 2019/3/14 22:16:15 6 */ 7 public class Product implements Cloneable { 8 /** 9 * 构造函数 10 */ 11 public Product(String prouductId, String prouductName, String price) { 12 this.prouductId = prouductId; 13 this.prouductName = prouductName; 14 this.price = price; 15 } 16 17 /** 18 * 构造函数 19 */ 20 public Product(String prouductId, String prouductName) { 21 this.prouductId = prouductId; 22 this.prouductName = prouductName; 23 this.price = "0"; 24 } 25 26 /** 27 * 商品id 28 */ 29 private String prouductId; 30 /** 31 * 商品id 32 */ 33 private String prouductName; 34 /** 35 * 价格 36 */ 37 private String price; 38 39 public String getProuductId() { 40 return prouductId; 41 } 42 43 public void setProuductId(String prouductId) { 44 this.prouductId = prouductId; 45 } 46 47 public String getProuductName() { 48 return prouductName; 49 } 50 51 public void setProuductName(String prouductName) { 52 this.prouductName = prouductName; 53 } 54 55 public String getPrice() { 56 return price; 57 } 58 59 public void setPrice(String price) { 60 this.price = price; 61 } 62 63 @Override 64 protected Object clone() { 65 Product productClone = new Product(prouductId, prouductName); 66 productClone.setPrice(price); 67 68 return productClone; 69 } 70 71 @Override 72 public boolean equals(Object o) { 73 if (this == o) { 74 return true; 75 } 76 if (!(o instanceof Product)) { 77 return false; 78 } 79 Product product = (Product) o; 80 return Objects.equals(getProuductId(), product.getProuductId()) && Objects.equals(getProuductName(), product.getProuductName()) && Objects.equals(getPrice(), product.getPrice()); 81 } 82 83 @Override 84 public String toString() { 85 return "Product{" + "prouductId=‘" + prouductId + ‘\‘‘ + ", prouductName=‘" + prouductName + ‘\‘‘ + ", price=‘" + price + ‘\‘‘ + ‘}‘; 86 } 87 88 public static void main(String[] args) { 89 Product product = new Product("201903142226", "钢铁侠", "500"); 90 91 Product productClone = (Product) product.clone(); 92 93 System.out.println("productClone:\n" + productClone); 94 System.out.println("product==productClone?:" + product.equals(productClone)); 95 System.out.println("product.getClass()==productClone.getClass()?:" + product.getClass().equals(productClone.getClass())); 96 System.out.println("product.clone().equals(product)?"+product.clone().equals(product)); 97 } 98 }
运行结果:
三、原始模型的分类:
简单原始模型:
Prototype(抽象原始模型角色):抽象类或者一个接口,给出具体模型需要的接口。
ConcretePrototype(具体原始模型角色):继承抽象原型模型角色,被复制的对象。
Client(客户端):提出复制请求。
/** * 抽象原始模型角色 * * @author ZhouDX * @since 2019/3/14 22:12:10 */ public interface Prototype extends Cloneable { Prototype clone(); }
原文地址:https://www.cnblogs.com/zhoudaxing/p/10534282.html
时间: 2024-10-14 07:31:22