设计模式 - 原型模式 ( Prototype ) 平时用的不多

本文介绍了Java中的原型模式,强调了Object类自带的clone()方法以及实现Cloneable接口的重要性。文章通过实例展示了浅克隆与深克隆的区别,指出在属性过多时可以考虑使用原型模式。同时,讨论了String和StringBuilder在克隆中的特殊性,String不需要额外的深克隆处理,而StringBuilder则需要。
摘要由CSDN通过智能技术生成

在这里插入图片描述

java中的原型模式

  • 自带 -> Object.clone()
  • 实现原型模式需要实现标记型接口Cloneable
  • 一般会重写clone()方法
  • 一般用于一个对象的属性已经确定, 需要产生很多相同对象的时候
  • 或者一个对象的属性过多, 可以省去大量setXXX的代码
  • 需要区分深克隆与浅克隆

对于属性过多的对象, 也可以考虑用builder模式, 原型模式用的不多


浅克隆

只在Person类中加一个clone方法, 不在Location中加clone方法

改了p1对象的某个属性, 发现p2的这个属性也被改了
虽然p1和p2不是同一个地址的对象, 但是他们的属性引用的是同一个对象

public class Test {
   
    public static void main(String[] args) throws Exception {
   
        Person p1 = new Person();
        Person p2 = (Person) p1.clone();
        System.out.println(p2.age + " " + p2.score);
        System.out.println(p2.loc);

        System.out.println(p1.loc == p2.loc);
        p1.loc.street = "sh";
        System.out.println(p2.loc);
    }
}

class Person implements Cloneable {
   
    int age = 8;
    int score = 100;

    Location loc = new Location("bj", 22);

    @Override
    public Object clone() throws CloneNotSupportedException {
   
        return super.clone();
    }
}

class Location {
   
    String street;
    int roomNo;

    @Override
    public String toString() {
   
        return "Location{ street='" + street + '\'' + ", roomNo=" + roomNo + '}';
    }

    public Location(String street, int roomNo) {
   
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值