案例引入
在平常我们要复制一个对象会怎么做,直接赋值肯定不行,这只是将相同的对象的地址赋值给它,要真正拷贝一份副本只能老老实实地遍历对象属性,而且无法直接复制对象的私有属性,除非对象开放了数据接口,到了这一步就走到了死胡同。
但如果我们这么做,为我们需要对外提供复制的对象提供整个对象直接复制的方法,需要复制就可以请求该方法,返回一个对象,问题不就迎刃而解了吗。另外一面,直接返回对象,可以避免对象之间过多的耦合,便于维护。而这种思想就是原型模式。
原型模式优缺点
原型模式可以快速便捷地生产复杂对象,优缺点如下:
优点
可以方便快捷拷贝复杂对象
避免对象代码的反复初始化
使用继承下,可以自定义复杂对象的处理逻辑
直接拷贝对象,避免与对象所属类的耦合
缺点
如果拷贝的对象中存在对象的循环引用,实现较为麻烦
案例
自定义一个people作为父类,创建student和driver两个子类,使用一个getObject的方法直接返回拷贝的对象
package 原型对象;
public abstract class People {
String name;
String sex;
public People() {
}
@Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public People(People people){
if(people!=null){
this.name=people.name;
this.sex = people.sex;
}
}
public abstract People cloneObject();
}
package 原型对象;
public class Driver extends People{
String job;
public Driver() {
}
public Driver(Driver people) {
super(people);
if(people!=null){
this.job = people.job;
}
}
@Override
public People cloneObject() {
return new Driver(this);
}
public String getJob() {
return job;
}
@Override
public String toString() {
return "Driver{" +
"job='" + job + '\'' +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
public void setJob(String job) {
this.job = job;
}
}
package 原型对象;
public class Student extends People{
String schoolName;
public Student(Student people) {
super(people);
if(people!=null){
this.schoolName = people.schoolName;
}
}
public String getSchoolName() {
return schoolName;
}
public void setSchoolName(String schoolName) {
this.schoolName = schoolName;
}
@Override
public String toString() {
return "Student{" +
"schoolName='" + schoolName + '\'' +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
@Override
public People cloneObject() {
return new Student(this);
}
}
public class Application {
public static void main(String[] args) {
Driver driver= new Driver();
driver.setJob("司机");
driver.name="lin";
driver.sex="男";
People driver1 = driver.cloneObject();
System.out.println(driver1.toString());
}
}
总结
原型模式的本质是通过提供一个目标对象所属类的对象返回方法,一般通过抽象类的继承的来实现,目的在于便于对象的复制,同时降低类的耦合度的目的。