设计模式 - 原型模式

定义

原型模式(Prototype):通过已经实例好的对象实例,通过复制的方式 获取 内容相同或者类似的 对象;

特点

  • 获取对象不通过直接调用构造方法 的形式获取
  • 获取的对象本身就可以包含一些属性
  • 可节省资源

优缺点

优点

  • 通过深拷贝 获取 一个包含原内容的新对象,简化了对象的创建过程,且少了部分内容的重复赋值

缺点

  • 需要为类配置 clone 方法
  • clone 方法在 对象内部,修改 逻辑 必须修改类;不符合"开闭原则"
  • 深拷贝实现 比较复杂,尤其 多层嵌套的对象 需要每一层都实现深拷贝

主要组成结构

  • 抽象原型类:在上层实现了 原型对象的 高层方法或属性
  • 具体原型类:具体实现 自己的 clone 方法,是被具体复制 的对象
  • 调用者:具体调用具体原型类的clone方法复制对象

应用场景

  • 如果有些对象 我们需要大量使用,但是初始状态差不多;我们就可以不使用 构造方法 创建对象;使用原型模式 copy 获取可以节省资源
  • 创建对象成本太高(初始化时间较长、占CPU太多)
  • 使用频繁,且需要重复赋值的属性值 相同或相似

代码实现

浅拷贝:拷贝出来的新对象,新对象的属性和原对象完全相同,对于非基本类型的属性地址仍然是原对象的属性对象地址,只是 新对象的地址 是新的
深拷贝:拷贝出来的新对象,完全是一个新对象;属性对象地址和此对象地址 都是全新的

浅拷贝

public class PrototypePattern {

    public static void main(String[] args) {
        final ShallowCloneInstance instance = new ShallowCloneInstance();
        instance.setItem("ShallowCloneInstance");
        instance.setPerson(new Person());
        final ShallowCloneInstance clone = instance.clone();
        System.out.println(instance);
        System.out.println(clone);
        System.out.println(instance.getItem());
        System.out.println(instance.getPerson());
        System.out.println(clone.getItem());
        System.out.println(clone.getPerson());
    }

}

/**
 * 浅克隆
 */
class ShallowCloneInstance implements Cloneable{

    private String item;
    private Person person;

    public String getItem() {
        return item;
    }

    public Person getPerson() {
        return person;
    }

    public ShallowCloneInstance() {

    }

    public void setItem(String item) {
        this.item = item;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    @Override
    public ShallowCloneInstance clone() {
        try {
            return (ShallowCloneInstance) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
}

result

com.beauty.designpatterns.creation.ShallowCloneInstance@5b464ce8
com.beauty.designpatterns.creation.ShallowCloneInstance@57829d67
ShallowCloneInstance
com.beauty.designpatterns.creation.Person@19dfb72a
ShallowCloneInstance
com.beauty.designpatterns.creation.Person@19dfb72a
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值