定义
使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象
使用场景
- 当一个对象的构建代价过高时。例如某个对象里面的数据需要访问数据库才能拿到,而我们却要多次构建这样的对象。
- 当构建的多个对象,均需要处于某种原始状态时,就可以先构建一个拥有此状态的原型对象,其他对象基于原型对象来修改。
实例
假设我们要生成多篇不同报表,内容基本不变,头部要不同
/**
* 原型模式:使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象
* 使用场景:
* 当一个对象的构建代价过高时,例如某个对象里面的数据需要访问数据库才能拿到,而我们却要多次构建这样的对象
* 当构建的多个对象均需要处于某种原始状态时,就可以先构建一个拥有此状态的原型对象,其他对象基于原型对象来修改
* @author xinjiao.yu
* @date 2023/02/01 13:31
**/
public interface Prototype {
Prototype copy();
}
/**
* 这个类就是我们的原型类,准备被其他人克隆使用的,所以其实现prototy接口具备克隆的能力
* 假设我们要生成多篇不同报表,内容基本不变,头部要不同
*/
class Report implements Prototype {
private List<String> parts;
public Report(){
this.parts = new ArrayList<>();
}
public Report(List<String> parts){
this.parts = parts;
}
public void loadData() {
parts.clear();
parts.add("第一句");
parts.add("第二句");
parts.add("第三局");
}
public List<String> getContents() {
return parts;
}
@Override
public Prototype copy() {
List<String> cloneList = new ArrayList<>(parts);
return new Report(cloneList);
}
public static void main(String[] args) {
// 创建原型
Report reportPrototype = new Report();
reportPrototype.loadData();
// 使用原型对象构建新的对象
Report reportWithTitle = (Report) reportPrototype.copy();
List<String> reportContent = reportWithTitle.getContents();
reportContent.add(0,"《江城子》");
reportContent.add(1,"---------------");
for(String s:reportContent){
System.out.println(s);
}
}
}