设计模式之原型模式

原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而不是通过实例化类的方式。这种模式特别适用于创建复杂对象时,避免重复初始化过程,从而提高性能和效率。

在原型模式中,通常会有一个接口 Cloneable 和一个方法 clone(),用于实现对象的浅拷贝或深拷贝。通过这种方式,可以灵活地创建对象的副本,并且可以根据需要进行定制。

主要特性:

  • 高效性: 通过克隆已有对象来创建新对象,避免了复杂的初始化过程。
  • 灵活性: 可以根据需要对克隆的对象进行进一步的修改和定制。
  • 避免重复代码: 减少了重复的构造代码,使得代码更加简洁和易于维护。
  • 支持深拷贝和浅拷贝: 可以根据需求选择合适的拷贝方式。
  • 单一职责原则: 将对象的创建逻辑与业务逻辑分离,符合单一职责原则。

一、工作中的应用场景

1.1 图形用户界面(GUI)

在GUI应用中,控件的创建和配置可能非常复杂。通过原型模式,可以从现有的控件模板创建新的控件。

1.2 游戏开发

在游戏中,角色、道具等对象通常有多个属性,如攻击力、防御力、速度等。通过原型模式,可以轻松地创建不同配置的角色或道具。

1.3 缓存系统

在缓存系统中,可以通过原型模式快速生成缓存对象,避免重复创建相同的对象。

二、编程实现

下面是一个简单的Java实现示例,演示了如何使用原型模式来创建一个订单对象。在这个例子中,我们将创建一个名为Order的类,并为其提供一个克隆方法clone(),以便可以快速创建订单对象的副本。

2.1 创建Order类

// 复杂对象 - 订单
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);
    }
}

2.2 主程序

// 测试原型模式的应用
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路旅记
感兴趣的伙伴可以关注订阅,方便浏览。

你可能感兴趣的:(设计模式,设计模式)