一、什么是原型模式?
1、定义
原型模式定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
2、类型:创建类模式
3、顺口溜:单工抽建原
二、原型模式UML
三、JAVA代码实现
关于克隆,其实不论是 JAVA代码还是C#代码都封装了一个接口Cloneable,实现这个接口就可以进行克隆了。
package com.amosli.dp.build.prototype;
public class Prototype implements Cloneable {
public Prototype clone() {
try {
return (Prototype) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
}
package com.amosli.dp.build.prototype;
public class ConcretePrototype extends Prototype{
public void show(){
System.out.println("show ...");
}
}
package com.amosli.dp.build.prototype;
import java.util.ArrayList;
import java.util.List;
public class Client {
public static void main(String[] args) {
ConcretePrototype concretePrototype = new ConcretePrototype();
for (int i = 0; i < 5; i++) {
ConcretePrototype clone = (ConcretePrototype) concretePrototype.clone();
clone.show();
}
Person p = new Person();
p.setAddr("sh");
p.setName("amosli");
List<String> friends=new ArrayList<String>();
friends.add("a");
friends.add("b");
friends.add("c");
p.setFriends(friends);
p.setClasses(new String[2]);
Person clone = p.clone();
System.out.println(p);
System.out.println(clone);
System.out.println(p.getClasses());
System.out.println(clone.getClasses());
System.out.println(clone.getFriends());
System.out.println(p.getFriends());
}
}
package com.amosli.dp.build.prototype;
import java.util.List;
public class Person implements Cloneable {
public Person clone() {
try {
Person p = (Person) super.clone();
p.setClasses(classes.clone());
return p;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
private String[] classes;
public String[] getClasses() {
return classes;
}
public void setClasses(String[] classes) {
this.classes = classes;
}
private String name;
private String addr;
private List<String> friends;
public List<String> getFriends() {
return friends;
}
// @Override
// public String toString() {
// return "Person [name=" + name + ", addr=" + addr + ", friends=" + friends
// + "]";
// }
public void setFriends(List<String> friends) {
this.friends = friends;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
}
1、浅克隆
可以看到 克隆对象和原对象地址是不一样的,但是其中的classes地址是一样的,说明只是地址引用,所以如果想避免同一样地址引用,所以最好需要对单独的属性进行克隆。
2、深克隆
这是代码之间的区别为:
四、使用场景
原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。在实际应用中,原型模式很少单独出现。经常与其他模式混用,他的原型类Prototype也常用抽象类来替代。
五、源码地址
本系列文章源码地址,https://github.com/amosli/dp 欢迎Fork & Star !!