原创

设计模式之原型模式

作者:cndz 围观群众:645 更新于 标签:设计模式原型模式

设计模式是软件开发中的重要概念,它提供了一些被证明可靠的解决方案来解决常见问题。其中一个设计模式是原型模式。本文将深入介绍原型模式,包括其定义、实现和示例。

什么是原型模式?

原型模式是一种创建型设计模式,允许使用已有对象作为原型,从而创建新对象。该模式的核心思想是通过复制现有对象来创建一个新的对象,而不是从头开始构建一个新的对象。这种方法可避免在创建新对象时浪费时间和资源,并简化了代码。

在原型模式中,我们使用已有的对象作为原型并进行克隆,以创建与原始对象完全相同或相似的新对象。这个过程称为“克隆”,因为它产生的对象是由现有对象“克隆”而来的。通常,我们使用原型模式在运行时动态地创建对象。

实现原型模式

在实现原型模式时,我们需要考虑以下几点:

  1. 定义原型接口

首先,我们需要为原型对象定义一个接口,该接口应该声明一个用于克隆自身的方法。这个方法将在克隆时被调用,并返回一个新的对象。

public interface Prototype {
    public Prototype clone();
}
  1. 创建具体的原型类

接下来,我们需要为每个具体的对象实现原型接口。对于每个实现类,我们需要实现clone() 方法。该方法将创建并返回一个新的对象,该对象是当前对象的克隆。

public class ConcretePrototype1 implements Prototype {
    @Override
    public Prototype clone() {
        ConcretePrototype1 prototype = new ConcretePrototype1();
        // 复制属性
        return prototype;
    }
}

public class ConcretePrototype2 implements Prototype {
    @Override
    public Prototype clone() {
        ConcretePrototype2 prototype = new ConcretePrototype2();
        // 复制属性
        return prototype;
    }
}
  1. 克隆对象

最后,在使用原型模式时,我们需要从现有对象中创建新对象。这可以通过调用原型对象的clone()方法来实现。

ConcretePrototype1 prototype1 = new ConcretePrototype1(); // 创建原型对象
ConcretePrototype1 clone1 = (ConcretePrototype1) prototype1.clone(); // 克隆对象
ConcretePrototype2 prototype2 = new ConcretePrototype2();
ConcretePrototype2 clone2 = (ConcretePrototype2) prototype2.clone();

原型模式示例

在本节中,我们将演示如何使用原型模式来创建一个学生管理系统。该系统包括 Student 类和 StudentCache 类。Student 类表示学生,StudentCache 类表示缓存学生对象。

Step 1 - 创建 Student 类

首先,我们创建了一个 Student 类,该类具有以下属性:

public class Student implements Prototype {

    private int id;
    private String name;
    private int age;

    public Student(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    @Override
    public Prototype clone() {
        return new Student(id, name, age);
    }

    // Getters and setters
}

Step 2 - 创建 StudentCache 类

我们还需要一个类来缓存学生对象。 StudentCache 类包括以下属性和方法:

public class StudentCache {

    private static Map<Integer, Student> studentMap = new HashMap<>();

    static {
        Student s1 = new Student(1, "张三", 18);
        Student s2 = new Student(2, "李四", 19);
        studentMap.put(s1.getId(), s1);
        studentMap.put(s2.getId(), s2);
    }

    public static Student getStudent(int id) {
        return studentMap.get(id).clone();
    }
}

Step 3 - 测试代码

现在,我们可以测试原型模式的实现。在下面的示例中,我们从 StudentCache 类中获取学生对象:

public class PrototypeDemo {

    public static void main(String[] args) {

        // 获取学生对象
        Student s1 = StudentCache.getStudent(1);
        System.out.println(s1.getName()); // 输出:张三

        // 修改学生姓名
        s1.setName("王五");

        // 再次获取学生对象
        Student s2 = StudentCache.getStudent(1);
        System.out.println(s2.getName()); // 输出:张三
    }
}

在上面的示例中,我们首先从 StudentCache 中获取一个学生对象,并输出其姓名。然后,我们将学生姓名更改为“王五”。最后,我们再次获取相同的学生对象并输出其姓名。这里,我们期望输出“张三”,因为我们已经对克隆对象进行了修改,而原始对象保持不变。

总结

原型模式是一种创建型设计模式,它使用现有对象作为原型来创建新对象。该模式的核心思想是通过复制现有对象来创建一个新的对象,而不是从头开始构建一个新的对象。在实现原型模式时,我们需要定义原型接口、创建具体的原型类和克隆对象。最后,在使用原型模式时,我们需要从现有对象中创建新对象。