原型模式是我要介绍的最后一个创建型设计模式。在这里记录了一什么是创建型模式。
创建型模式主要关注的是怎样创建对象,它的主要特点是“将对象的创建与使用分离”。这样可以降低耦合度,使用者不用关心对象是怎么创建的。
原型(Prototype)模式的定义:用一个已经创建的实例为原型,通过复制该原型来创建一个与原型相同或相似的实例。
这样创建对象非常高效,就像windows系统的复制粘贴一样,如何复制我们可以自行设计规则,这样就能创建出有差异的对象。
优点:
- java自带的原型模式基于二进制流的复制,在性能在比new一个对象更加优良
- 可以使用深克隆,来保存一个对象,以便在需要的时候拿来用(例如恢复到历史某一个状态),可辅助实现撤销操作。
缺点:
- 需要为每一个类配置一个clone方法
- clone方法位于类的内部,当改变clone规则时,需要修改代码,违背了开闭原则
- 深克隆在有些场景实现起来比较麻烦,例如:对象之间存在多重嵌套。所以深克隆和浅克隆需要运用得当
原型模式的结构:
- 抽象原型:规定了具体原型对象必须实现的接口
- 具体原型:实现抽象原型,它是可被复制的对象
- 访问类:使用具体原型
原型模式的实现:
因为java提供了clone方法,所以实现原型模式很简单
原型模式的克隆分为深克隆和浅克隆
- 浅克隆:对象属性和原对象完全相同,非基本类型属性仍指向原对象的内存地址
- 深克隆:原型有的属性也被克隆,不再是指向原对象的内存地址
举例场景:使用浅克隆克隆一只羊:
package com.wly.DesignPatterns;
/**
* @program: StudyDome
* @author: yuanzhang
* @create: 2020-11-26 10:44
**/
public class PrototypeTest {
public static void main(String[] args) throws CloneNotSupportedException {
Sheep sheep = new Sheep();
sheep.setName("多莉");
Sheep sheep1 = (Sheep)sheep.clone();
System.out.println("sheep----我是原型羊:"+sheep.getName()+"编码为:"+sheep.getCode()); System.out.println("sheep1----我是克隆羊:"+sheep1.getName()+"编码为:"+sheep1.getCode());
System.out.println("原型羊和克隆羊是同一只吗:"+(sheep==sheep1?"是的":"不是"));
}
}
class Sheep implements Cloneable{
private String name;
private int code = 1;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public int getCode() {
return code;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Sheep sheep = (Sheep) super.clone();
sheep.code = (++sheep.code);
return sheep;
}
}
输出:
sheep----我是原型羊:多莉编码为:1 sheep1----我是克隆羊:多莉编码为:2 原型羊和克隆羊是同一只吗:不是