原型模式是什么?
原型模式属于创建型模式,是用于创建重复的对象,同时又能保证性能。是一种创建对象的最佳方式。
原型模式可以干嘛?
原型模式是通过一个原来已存在的对象进行拷贝,然后生成一个新的对象。在日常开发过程中需要进行拷贝。就比如现在流行的病毒其实就是自己本身的一个拷贝,而不断繁衍的。
优点:
性能高:由于底层用二进制进行拷贝
绕开构造函数的约束
缺点:
必须实现Cloneable接口
类图
源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
实现代码
代码语言:javascript复制/**
* @Auther: csh
* @Date: 2020/5/18 16:05
* @Description:病毒
*/
public class Virus implements Cloneable {
@Override
protected Virus clone() throws CloneNotSupportedException {
return (Virus)super.clone();
}
}
代码语言:javascript复制/**
* @Auther: csh
* @Date: 2020/5/18 16:05
* @Description:浅拷贝 病毒
*/
public class ShallowVirus implements Cloneable {
private List<String> list = new ArrayList <String>();
public List <String> getList() {
return list;
}
public void addName(String name){
list.add(name);
}
public void printNames(){
for (String name : list) {
System.out.println(name);
}
}
public void setList(List <String> list) {
this.list = list;
}
@Override
protected ShallowVirus clone() throws CloneNotSupportedException {
return (ShallowVirus)super.clone();
}
}
代码语言:javascript复制/**
* @Auther: csh
* @Date: 2020/5/18 16:05
* @Description:深拷贝 病毒
*
*
*/
public class DeepVirus implements Cloneable {
private List<String> list = new ArrayList <String>();
public List <String> getList() {
return list;
}
public void addName(String name){
list.add(name);
}
public void printNames(){
for (String name : list) {
System.out.println(name);
}
}
public void setList(List <String> list) {
this.list = list;
}
@Override
protected DeepVirus clone() throws CloneNotSupportedException {
try {
DeepVirus deepVirus = (DeepVirus)super.clone();
List<String> newList = new ArrayList <String>();
for (String val : this.getList()) {
newList.add(val);
}
//再把这个list复制到对象中
deepVirus.setList(newList);
return deepVirus;
}catch (Exception e){
System.out.println(e);
return null;
}
}
}
代码语言:javascript复制/**
* @Auther: csh
* @Date: 2020/5/18 16:07
* @Description:原型测试
* 浅克隆:被克隆对象的所有变量都含有与原来的对象相同的值,而它所有的对其他对象的引用都仍然指向原来的对象。换一种说法就是浅克隆仅仅克隆所考虑的对象,而不克隆它所引用的对象。
*
* 深克隆:被克隆对象的所有变量都含有与原来的对象相同的值,但它所有的对其他对象的引用不再是原有的,而这是指向被复制过的新对象。换言之,深复制把要复制的对象的所有引用的对象都复制了一遍,这种叫做间接复制。
*
*/
public class Client {
public static void main(String[] args) {
try {
//拷贝
Virus copyVirus = new Virus();
System.out.println(copyVirus);
Virus clone = copyVirus.clone();
System.out.println(clone);
//浅拷贝
ShallowVirus virus = new ShallowVirus();
virus.addName("新冠状1");
System.out.println("原病毒" virus);
ShallowVirus newVirus = virus.clone();
newVirus.addName("新冠状2");
System.out.println("新病毒" newVirus);
virus.printNames();
System.out.println("----------");
newVirus.printNames();
//深拷贝
System.out.println("----------");
DeepVirus deepVirus = new DeepVirus();
deepVirus.addName("SAAS1");
DeepVirus deepVirus2 = deepVirus.clone();
deepVirus2.addName("SAAS2");
deepVirus.printNames();
System.out.println("---------------");
deepVirus2.printNames();
} catch (Exception e) {
e.printStackTrace();
}
}
}
最后:
原型模式是非常简单的一种,但是需要特别注意,浅拷贝带来的坑,否则在日常开发过程中遇到的问题多了去了...