? 原型模式是指通过复制已有对象来创建新对象,而无需再次调用构造函数,当一个对象的构造需要消耗大量的资源时,通过使用原型模式,可以避免重复的创建过程,从而提高性能。
? 在我们用到的音乐播放器软件都会有一些各种类型的歌单,但是有一些歌单的歌曲可能是重复的。而当我们想要创建一个新的歌单时,需要引用其他歌单中的大量的歌曲时,我们就可以复制别人的歌单,然后筛选掉哪些不需要的歌单,再去添加自己喜欢的歌曲到新歌单,这就节省了大量的时间去搜索新的歌曲添加到新歌单。
package com.designpattern.mode.prototype;
public class Prototype {
public static void main(String[] args) {
//创建原型对象
AbstractPrototype original = new ConcretePrototype("Original Data");
//克隆原型对象
AbstractPrototype clone = original.clone();
//输出克隆对象的数据
System.out.println("Clone Data:"+((ConcretePrototype) clone).getData());
}
}
//定义抽象原型类
abstract class AbstractPrototype implements Cloneable{
public abstract AbstractPrototype clone();
}
//创建具体原型类
class ConcretePrototype extends AbstractPrototype{
private String data;
public ConcretePrototype(String data) {
this.data = data;
}
@Override
public AbstractPrototype clone() {
return new ConcretePrototype(this.data);
}
public String getData(){
return data;
}
}
公司正在开发一个图形设计软件,其中有一个常用的图形元素是矩形。设计师在工作时可能需要频繁地创建相似的矩形,而这些矩形的基本属性(如颜色、宽度、高度)相同,但具体的位置可能不同。
为了提高设计师的工作效率,请你使用原型模式设计一个矩形对象的原型。该原型可以根据用户的需求进行克隆,生成新的矩形对象。
第一行输入一个整数 N(1 ≤ N ≤ 100),表示需要创建的矩形数量。
接下来的 N 行,每行输入一个字符串,表示矩形的属性信息,分别为颜色,长度,宽度,比如 “Red 10 5”。
对于每个矩形,输出一行字符串表示矩形的详细信息,如 “Color: Red, Width: 10,Height: 5”。
package com.designpattern.mode.prototype;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int nums = scanner.nextInt();
ConcreteRectangle concreteRectangle =null;
for(int i=0;i<nums;i++){
String rectangle = scanner.nextLine();
String[] rectangleAttributes = rectangle.split(" ");
String color= scanner.next();
int width= scanner.nextInt();
int height=scanner.nextInt();
//创建原型对象
AbstractRectanglePrototype abstractRectanglePrototype =
new ConcreteRectangle(color,width,height);
//克隆对象并输出详细信息
// AbstractRectanglePrototype cloneRectangle = abstractRectanglePrototype.clone();
// System.out.println(cloneRectangle);
AbstractRectanglePrototype cloneRectangle = abstractRectanglePrototype.clonePrototype();
System.out.println(cloneRectangle.getDetails());
}
}
}
//创建抽象类,声明克隆方法
abstract class AbstractRectanglePrototype implements Cloneable{
//创建复制矩形的方法
public abstract AbstractRectanglePrototype clone();
public AbstractRectanglePrototype clonePrototype(){
try {
return (AbstractRectanglePrototype) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
//打印矩形
public abstract String getDetails();
}
//创建具体的矩形类
class ConcreteRectangle extends AbstractRectanglePrototype{
//分别创建颜色、宽度、高度
private String color;
private int width;
private int height;
public ConcreteRectangle() {
}
public ConcreteRectangle(String color, int width, int height) {
this.color = color;
this.width = width;
this.height = height;
}
public String getColor() {
return color;
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
@Override
public AbstractRectanglePrototype clone() {
return new ConcreteRectangle(this.color,this.width,this.height);
}
@Override
public String getDetails() {
return "color:" + color +
", width:" + width +
", height:" + height;
}
@Override
public String toString() {
return "color:" + color +
", width:" + width +
", height:" + height;
}
}
优点:减少对象的创建和初始化开销,提高性能
总结:无需再次调用构造函数就能通过复制已有对象来创建新对象
场景:适用于频繁创建和销毁大量相似对象的场景