原型模式

克隆羊问题
现在有一只羊tom,姓名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和tom 羊 属性完全相同的10只羊。

传统方法

public class Sheep {
    
    private String name;
    private int age;
    private String color;
//setter getter 省略
}

  public static void main(String[] args) {
        Sheep sheep = new Sheep("tom", 1, "白色");
        Sheep sheep2 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor());
        Sheep sheep3 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor());
}

传统的方式的优缺点
1) 优点是比较好理解,简单易操作。

2) 在创建新的对象时,总是需要重新获取原始对象的属性,如果创建的对象比较复杂 时,效率较低

3) 总是需要重新初始化对象,而不是动态地获得对象运行时的状态, 不够灵活

4) 改进的思路分析
思路:Java中Object类是所有类的根类,Object类提供了一个clone()方法,该方法可以 将一个Java对象复制一份,但是需要实现clone的Java类必须要实现一个接口Cloneable, 该接口表示该类能够复制且具有复制的能力 => 原型模式

原型模式-基本介绍


基本介绍
1) 原型模式(Prototype模式)是指:用原型实例指定创建对象的种类,并且通过拷 贝这些原型,创建新的对象 
2) 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象, 无需知道如何创建的细节
3) 工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建 的对象通过请求原型对象拷
贝它们自己来实施创建,即 对象.clone() 

三、浅克隆和深克隆
需要注意的是克隆有深拷贝和浅拷贝之分。

1.浅拷贝: 将原对象或原数组的引用直接赋给新对象,新数组,新对象/数组只是原对象的一个引用

2.深拷贝: 创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来,是“值”而不是“引用”

为什么要使用深拷贝?
我们希望在改变新的数组(对象)的时候,不改变原数组(对象)

 

//Sheep 中加上clone 方法
@Override
    protected Object clone() throws CloneNotSupportedException {
    
        Sheep sheep=null;
        try {
        
        }catch (Exception e){
             sheep=(Sheep) super.clone();
        }
        return sheep;
    }

测试

  Sheep sheep = new Sheep("tom", 1, "白色");
        Sheep sheep2=sheep;
        System.out.println(sheep2==sheep);//true  ---浅拷贝
        Sheep sheep1 = (Sheep) sheep.clone();
        System.out.println(sheep==sheep1);//false---深拷贝

注意:只有浅拷贝才是同一个对象,深拷贝不是。 

原型模式的注意事项和细节
1) 创建新的对象比较复杂时,可以利用原型模式简化对象的创建过程,同时也能够提 高效率 
2) 不用重新初始化对象,而是动态地获得对象运行时的状态 
3) 如果原始对象发生变化(增加或者减少属性),其它克隆对象的也会发生相应的变化, 无需修改代码 
4) 在实现深克隆的时候可能需要比较复杂的代码
 5) 缺点:需要为每一个类配备一个克隆方法,这对全新的类来说不是很难,但对已有 的类进行改造时,需要修
改其源代码,违背了ocp原则,这点请同学们注意.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值