定义

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,无须知道如何创建的细节。

原理

通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝他们来实施创建,即对象.clone();
这里可能涉及到深拷贝以及浅拷贝的只是看这一篇:深拷贝以及浅拷贝

使用场景

  • 当一个系统应该独立于它的产品创建,构成和表示时。
  • 当要实例化的类是在运行时刻指定时,例如,通过动态装载。
  • 为了避免创建一个与产品类层次平行的工厂类层次时。
  • 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

    UML

    image.png

    优点

  • 性能提高。

  • 逃避构造函数的约束。

    缺点

    需要为每一个类配备一个克隆方法,这对全新的类来说不是很难,但对已有
    的类进行改造时,需要修改其源代码,违背了ocp原则

    代码示例

    Sheep.java

    1. @Data
    2. public class Sheep implements Cloneable {
    3. private String name;
    4. private int age;
    5. public Sheep(String name, int age) {
    6. this.name = name;
    7. this.age = age;
    8. }
    9. @Override
    10. protected Object clone() throws CloneNotSupportedException {
    11. return super.clone();
    12. }
    13. }

    Client.java

    1. public class Client {
    2. @SneakyThrows
    3. public static void main(String[] args) {
    4. Sheep makabaka = new Sheep("makabaka",18);
    5. Sheep makabaka2 = (Sheep) makabaka.clone();
    6. Sheep makabaka3 = (Sheep) makabaka.clone();
    7. System.out.println(makabaka);
    8. System.out.println(makabaka2);
    9. System.out.println(makabaka3);
    10. }
    11. }

    输出

    1. Sheep(name=makabaka, age=18)
    2. Sheep(name=makabaka, age=18)
    3. Sheep(name=makabaka, age=18)

    框架示例

    Spring中原型bean的创建,就是原型模式的应用。
    后续再补充。