原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而不是通过实例化类的方式。这种模式特别适用于创建复杂对象时,避免重复初始化过程,从而提高性能和效率。
在原型模式中,通常会有一个接口 Cloneable 和一个方法 clone(),用于实现对象的浅拷贝或深拷贝。通过这种方式,可以灵活地创建对象的副本,并且可以根据需要进行定制。
主要特性:
在GUI应用中,控件的创建和配置可能非常复杂。通过原型模式,可以从现有的控件模板创建新的控件。
在游戏中,角色、道具等对象通常有多个属性,如攻击力、防御力、速度等。通过原型模式,可以轻松地创建不同配置的角色或道具。
在缓存系统中,可以通过原型模式快速生成缓存对象,避免重复创建相同的对象。
下面是一个简单的Java实现示例,演示了如何使用原型模式来创建一个订单对象。在这个例子中,我们将创建一个名为Order的类,并为其提供一个克隆方法clone(),以便可以快速创建订单对象的副本。
// 复杂对象 - 订单
class Order implements Cloneable {
private String customerName;
private String shippingAddress;
private List<String> items;
private double totalAmount;
public Order(String customerName, String shippingAddress, List<String> items, double totalAmount) {
this.customerName = customerName;
this.shippingAddress = shippingAddress;
this.items = new ArrayList<>(items); // 深拷贝列表
this.totalAmount = totalAmount;
}
// Getter 方法
public String getCustomerName() {
return customerName;
}
public String getShippingAddress() {
return shippingAddress;
}
public List<String> getItems() {
return items;
}
public double getTotalAmount() {
return totalAmount;
}
@Override
public String toString() {
return "Order{" +
"customerName='" + customerName + '\'' +
", shippingAddress='" + shippingAddress + '\'' +
", items=" + items +
", totalAmount=" + totalAmount +
'}';
}
// 克隆方法,实现深拷贝
@Override
protected Object clone() throws CloneNotSupportedException {
List<String> clonedItems = new ArrayList<>(this.items);
return new Order(this.customerName, this.shippingAddress, clonedItems, this.totalAmount);
}
}
// 测试原型模式的应用
public class PrototypePatternDemo {
public static void main(String[] args) {
try {
// 创建一个初始订单对象
List<String> initialItems = new ArrayList<>();
initialItems.add("Laptop");
initialItems.add("Mouse");
Order originalOrder = new Order("John Doe", "123 Main St, Anytown, USA", initialItems, 999.99);
// 打印初始订单信息
System.out.println("Original Order:");
System.out.println(originalOrder);
// 使用原型模式创建一个新的订单对象
Order clonedOrder = (Order) originalOrder.clone();
// 修改克隆订单的部分属性
clonedOrder.getItems().add("Keyboard");
clonedOrder.setTotalAmount(1099.99);
// 打印克隆后的订单信息
System.out.println("\nCloned Order:");
System.out.println(clonedOrder);
// 验证原始订单是否未受影响
System.out.println("\nOriginal Order after cloning:");
System.out.println(originalOrder);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
输出结果:
Original Order:
Order{customerName='John Doe', shippingAddress='123 Main St, Anytown, USA', items=[Laptop, Mouse], totalAmount=999.99}
Cloned Order:
Order{customerName='John Doe', shippingAddress='123 Main St, Anytown, USA', items=[Laptop, Mouse, Keyboard], totalAmount=1099.99}
Original Order after cloning:
Order{customerName='John Doe', shippingAddress='123 Main St, Anytown, USA', items=[Laptop, Mouse], totalAmount=999.99}
这段代码展示了如何利用原型模式来创建一个订单对象的副本。Order 类包含了订单的所有属性,并提供了 toString 方法用于打印订单信息;clone() 方法实现了深拷贝,确保克隆后的对象不会影响原始对象。
文章同步更新在个人微信公众号:IT路旅记
感兴趣的伙伴可以关注订阅,方便浏览。