创建型模式:原型模式
程序员文章站
2022-04-29 17:22:38
一、模式的定义与特点原型(Prototype)模式:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。原型模式优缺点见PPT素材部分。二、模式的结构原型模式的克隆分为浅克隆和深克隆,Java中的Object类提供了浅克隆的clone()方法,具体原型类只要实现Cloneable接口就可实现对象的浅克隆,所以用Java实现原型模式很简单。原型模式包含以下主要角色:...
一、模式的定义与特点
原型(Prototype)模式:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。
在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。
原型模式优缺点见PPT素材部分。
二、模式的结构
原型模式的克隆分为浅克隆和深克隆,Java中的Object类提供了浅克隆的clone()方法,具体原型类只要实现Cloneable接口就可实现对象的浅克隆,所以用Java实现原型模式很简单。
原型模式包含以下主要角色:
1、抽象原型类:规定了具体原型对象必须实现的接口。
2、具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。
3、访问类:使用具体原型类中的 clone() 方法来复制新的对象。
原型模式结构图见图1-1
三、原型模式的应用场景
1、对象之间相同或相似,即只是个别的几个属性不同的时候。
2、对象的创建过程比较麻烦,但复制比较简单的时候。
四、原型模式的扩展
原型模式可扩展为带原型管理器的原型模式,它在原型模式的基础上增加了一个原型管理器PrototypeManager类。
该类用HashMap保存多个复制的原型,Client类可以通过管理器的get(String id)方法从中获取复制的原型。
其结构图如图1-2所示。
五、模式的应用实例
具体原型类Resume.java:
package com.example.designpattern.prototype;
import androidx.annotation.NonNull;
/**
* @author Administrator
* @date 2020/7/20
* 具体原型角色,实现了克隆功能
*
* clone()为Object类所有,此处让Cloneable接口扮演抽象类角色,示例中不再单独给出抽象类角色
* (本例比较简单,具体参见PPT素材上的3种角色的示例代码)
*/
class Resume implements Cloneable {
private String name;
private int age;
private String sex;
private String tel;
private String workExperience;
public Resume(String name, int age, String sex, String tel, String workExperience) {
this.name = name;
this.age = age;
this.sex = sex;
this.tel = tel;
this.workExperience = workExperience;
}
public Resume(String name, int age, String sex, String tel) {
this.name = name;
this.age = age;
this.sex = sex;
this.tel = tel;
}
public Resume() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getWorkExperience() {
return workExperience;
}
public void setWorkExperience(String workExperience) {
this.workExperience = workExperience;
}
@Override
public String toString() {
return "Resume{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", tel='" + tel + '\'' +
", workExperience='" + workExperience + '\'' +
'}';
}
@NonNull
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
访问类Client.java:
package com.example.designpattern.prototype;
/**
* @author Administrator
* @date 2020/7/20
* 客户或访问类角色
*/
class Client {
public static void main(String[] args) {
//传统方式
Resume r1 = new Resume("张三", 20, "男", "13022220000");
r1.setWorkExperience("2008-2012 某科技公司 开发工程师");
Resume r2 = new Resume("张三", 20, "男", "13022220000");
r2.setWorkExperience("2012-2014 某电商公司 销售经理");
System.out.println(r1);
System.out.println(r2);
System.out.print("\n");
/*
* 使用原型模式
* 实例prototype是将要被复制的类,即具体原型
*/
Resume prototype = new Resume("李四原", 30, "女", "18033332222");
try {
//克隆得到的新对象
Resume r3 = (Resume) prototype.clone();
Resume r4 = (Resume) prototype.clone();
r3.setWorkExperience("2000-2004 Google公司 CTO");
r4.setWorkExperience("2004-2006 Amazon公司 CFO");
System.out.println(prototype);
System.out.println(r3);
System.out.println(r4);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
测试结果:
六、PPT素材
本文地址:https://blog.csdn.net/ykmeory/article/details/107501573
上一篇: 方法与方法重载