软件设计模式之路-----原型模式

本文介绍了原型模式,这是一种创建型设计模式,用于高效地复制已有对象。原型模式通过实现克隆方法,使得对象的创建与使用分离,降低了耦合度。文章提到了原型模式的优点,如性能优于new操作,支持深克隆和浅克隆,并提供了深浅克隆的示例。同时,也指出了其缺点,如需要为每个类配置clone方法,且修改克隆规则可能涉及代码修改。最后,文章给出了一个羊的浅克隆例子,展示了原型模式的应用。
摘要由CSDN通过智能技术生成

原型模式是我要介绍的最后一个创建型设计模式。在这里记录了一什么是创建型模式。

创建型模式主要关注的是怎样创建对象,它的主要特点是“将对象的创建与使用分离”。这样可以降低耦合度,使用者不用关心对象是怎么创建的。

原型(Prototype)模式的定义:用一个已经创建的实例为原型,通过复制该原型来创建一个与原型相同或相似的实例。

这样创建对象非常高效,就像windows系统的复制粘贴一样,如何复制我们可以自行设计规则,这样就能创建出有差异的对象。

优点:

  • java自带的原型模式基于二进制流的复制,在性能在比new一个对象更加优良
  • 可以使用深克隆,来保存一个对象,以便在需要的时候拿来用(例如恢复到历史某一个状态),可辅助实现撤销操作。

缺点:

  • 需要为每一个类配置一个clone方法
  • clone方法位于类的内部,当改变clone规则时,需要修改代码,违背了开闭原则
  • 深克隆在有些场景实现起来比较麻烦,例如:对象之间存在多重嵌套。所以深克隆和浅克隆需要运用得当

原型模式的结构:

  • 抽象原型:规定了具体原型对象必须实现的接口
  • 具体原型:实现抽象原型,它是可被复制的对象
  • 访问类:使用具体原型

原型模式的实现:

因为java提供了clone方法,所以实现原型模式很简单

原型模式的克隆分为深克隆和浅克隆

  • 浅克隆:对象属性和原对象完全相同,非基本类型属性仍指向原对象的内存地址
  • 深克隆:原型有的属性也被克隆,不再是指向原对象的内存地址

举例场景:使用浅克隆克隆一只羊:

package com.wly.DesignPatterns;
/**
 * @program: StudyDome
 * @author: yuanzhang
 * @create: 2020-11-26 10:44
 **/
public class PrototypeTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        Sheep sheep = new Sheep();
        sheep.setName("多莉");
        Sheep sheep1 = (Sheep)sheep.clone();
        System.out.println("sheep----我是原型羊:"+sheep.getName()+"编码为:"+sheep.getCode());                System.out.println("sheep1----我是克隆羊:"+sheep1.getName()+"编码为:"+sheep1.getCode());
        System.out.println("原型羊和克隆羊是同一只吗:"+(sheep==sheep1?"是的":"不是"));
    }
}
class Sheep implements Cloneable{
    private String name;
    private int code = 1;
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }

    public int getCode() {
        return code;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Sheep sheep = (Sheep) super.clone();
        sheep.code = (++sheep.code);
        return sheep;
    }
}

输出:

sheep----我是原型羊:多莉编码为:1
sheep1----我是克隆羊:多莉编码为:2
原型羊和克隆羊是同一只吗:不是

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值