创建型模式-原型模式

创建型模式-原型模式

原型模式是一种创建型设计模式,其目的是通过克隆已有对象来创建新的对象,而无需使用昂贵的创建操作。

原型模式基于原型实例创建新对象,而不是通过调用构造函数。原型实例是通过克隆方法来创建新对象的,克隆方法可以是浅克隆或深克隆。

浅克隆(Shallow Clone)会创建一个新对象,但新对象的字段将引用原型对象中相同的字段。也就是说,原型对象和克隆对象共享相同的引用类型字段,而值类型字段则是独立的。

深克隆(Deep Clone)会创建一个新对象,并且新对象的所有字段都是独立的,包括引用类型字段。这意味着,在深克隆过程中,不仅克隆了原型对象本身,还递归地克隆了其引用类型字段。


原型模式的主要优点

  1. 减少对象的创建成本:

    通过克隆已有对象来创建新对象,避免了昂贵的创建操作,提高了创建对象的效率。

  2. 隐藏具体的对象创建细节:

    原型模式将对象的创建过程封装在原型对象内部,客户端无需关心具体的创建细节。

  3. 支持动态添加和删除对象:

    通过原型模式,可以在运行时动态地添加或删除原型对象,从而影响到克隆对象的创建。


原型模式注意事项

  1. 克隆方法的实现:

    在实现原型模式时,需要正确实现克隆方法。对于深克隆,需要递归地克隆引用类型字段。

  2. 对象状态的处理:

    克隆对象是一个新对象,但它可能共享一些引用类型字段。因此,在修改克隆对象的引用类型字段时,需要注意对原型对象和克隆对象的影响。


原型模式示例

以创建和克隆图形对象为例

import java.util.ArrayList;
import java.util.List;

// 抽象原型类
interface Shape extends Cloneable {
    void draw();
    Shape clone();
}

// 具体原型类 - 矩形
class Rectangle implements Shape {
    private String type;

    public Rectangle() {
        this.type = "Rectangle";
    }

    public void draw() {
        System.out.println("Drawing a rectangle.");
    }

    public Shape clone() {
        return new Rectangle();
    }
}

// 具体原型类 - 圆形
class Circle implements Shape {
    private String type;

    public Circle() {
        this.type = "Circle";
    }

    public void draw() {
        System.out.println("Drawing a circle.");
    }

    public Shape clone() {
        return new Circle();
    }
}

// 原型管理器
class ShapeManager {
    private List<Shape> shapes;

    public ShapeManager() {
        shapes = new ArrayList<>();
    }

    public void addShape(Shape shape) {
        shapes.add(shape);
    }

    public void removeShape(Shape shape) {
        shapes.remove(shape);
    }

    public Shape cloneShape(int index) {
        return shapes.get(index).clone();
    }
}

// 客户端
public class Main {
    public static void main(String[] args) {
        ShapeManager shapeManager = new ShapeManager();

        // 添加原型对象
        shapeManager.addShape(new Rectangle());
        shapeManager.addShape(new Circle());

        // 克隆原型对象
        Shape clonedShape1 = shapeManager.cloneShape(0);
        Shape clonedShape2 = shapeManager.cloneShape(1);

        // 使用克隆对象
        clonedShape1.draw(); // 输出: Drawing a rectangle.
        clonedShape2.draw(); // 输出: Drawing a circle.
    }
}

在上述示例中,我们使用原型模式来创建和克隆图形对象。

Shape 接口是抽象原型类,定义了绘制图形和克隆方法。

RectangleCircle 是具体原型类,实现了抽象原型类接口,分别代表矩形和圆形对象。

ShapeManager 是原型管理器类,用于管理原型对象。客户端可以通过原型管理器添加、删除和克隆原型对象。

在客户端 Main 类中,我们创建了原型管理器对象,并添加了矩形和圆形原型对象。然后,我们使用原型管理器来克隆原型对象,并使用克隆对象调用绘制方法。


通过原型模式,我们可以通过克隆已有对象来创建新对象,避免了昂贵的创建操作,并且可以动态地添加或删除原型对象。这样可以提高对象创建的效率和灵活性。

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xinyi_java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值