在软件开发中,原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而无需知道其具体实现。原型模式通常包含一个原型接口和多个实现了该接口的具体原型类。在本文中,我们将介绍 Java 设计模式中的原型模式,了解其定义、使用场景以及如何在实际开发中应用。
原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而无需知道其具体实现。在原型模式中,一个原型接口定义了一个克隆方法,而具体原型类实现了该克隆方法,从而允许通过复制现有对象的方法来创建新对象。
原型模式的应用场景包括但不限于以下情况:
对象创建成本高昂:
当对象的创建成本较高,而且新对象的创建过程与已有对象相似时,使用原型模式可以通过复制现有对象来降低创建成本
避免构造器执行:
当对象的构造器执行代价较高,但新对象的创建过程可以通过复制现有对象完成时,使用原型模式可以避免执行构造器
隐藏具体实现:
客户端不需要知道对象的具体实现类,只需要知道原型接口即可。这有助于降低客户端与具体类之间的耦合
原型模式的实现主要涉及以下两个角色:
下面是一个简单的原型模式的实现示例:
1)原型接口 Prototype
Prototype.java
package com.cheney.demo;
interface Prototype {
Prototype clone();
}
2)具体原型类 ConcretePrototype
ConcretePrototype.java
package com.cheney.demo;
class ConcretePrototype implements Prototype {
private String context;
public ConcretePrototype(String context) {
this.context = context;
}
@Override
public Prototype clone() {
return new ConcretePrototype(this.context);
}
public String getContext() {
return context;
}
public void setData(String data) {
this.context = data;
}
}
在上述示例中,Prototype
是原型接口,定义了克隆方法。ConcretePrototype
是具体原型类,实现了原型接口的克隆方法。
假设我们创建了一个经典的汉堡包,然后需要特殊人的口味复制它,再加入特殊配料。我们可以使用原型模式来创建图形对象的副本。
1)原型接口 Prototype
Prototype.java
package com.cheney.demo;
interface Prototype {
Prototype clone();
}
2)汉堡包原型接口 HamburgerPrototype
HamburgerPrototype.java
package com.cheney.demo;
interface HamburgerPrototype extends Prototype {
HamburgerPrototype clone();
void addIngredient(String ingredient);
void displayIngredients();
}
3)基础汉堡包原型 CheeseHamburgerPrototype
CheeseHamburgerPrototype.java
package com.cheney.demo;
import java.util.ArrayList;
import java.util.List;
class CheeseHamburgerPrototype implements HamburgerPrototype {
private final String name;
private final List<String> ingredients;
public CheeseHamburgerPrototype(String name) {
this.name = name;
this.ingredients = new ArrayList<>();
}
private CheeseHamburgerPrototype(CheeseHamburgerPrototype source) {
this.name = source.name;
this.ingredients = new ArrayList<>(source.ingredients);
}
@Override
public HamburgerPrototype clone() {
return new CheeseHamburgerPrototype(this);
}
@Override
public void addIngredient(String ingredient) {
this.ingredients.add(ingredient);
}
@Override
public void displayIngredients() {
System.out.println("汉堡包名字: " + name);
System.out.println("配料: " + String.join(", ", ingredients));
}
}
在上述示例中,HamburgerPrototype
是图形接口,继承了原型接口 Prototype
,定义了克隆方法,和配料的添加及打印。CheeseHamburgerPrototype
是经典汉堡包类,实现了汉堡包制作接口的克隆方法和配料的添加及打印方法。
4)制作汉堡包
package com.cheney.demo;
public class Main {
public static void main(String[] args) {
// 创建汉堡包原型对象
HamburgerPrototype originalHamburger = new CheeseHamburgerPrototype("经典汉堡包");
// 添加汉堡包原型的配料
originalHamburger.addIngredient("牛肉饼");
originalHamburger.addIngredient("芝士");
originalHamburger.addIngredient("西红柿片");
// 克隆汉堡包
HamburgerPrototype clonedHamburger = originalHamburger.clone();
// 添加克隆对象的配料
clonedHamburger.addIngredient("番茄酱");
// 显示原型和克隆对象的配料
originalHamburger.displayIngredients();
System.out.println(">>>>>>>>>>>>>>>> 克隆后的:>>>>>>>>>>>>>>>>");
clonedHamburger.displayIngredients();
}
}
执行结果
在上述示例中,我们创建了一个具体原型对象 originalHamburger
,然后通过调用 clone
方法来克隆对象,得到一个新的对象 clonedHamburger
。最后,我们分别调用原型和克隆对象的 displayIngredients
方法来打印配料。
原型模式是一种灵活且实用的设计模式,通过合理使用,可以提高系统的扩展性和性能。在实际开发中,可以根据需求选择适当的原型模式实现,确保系统具有良好的可维护性和可扩展性。