原型模式
2021-3-9
·
hexer

原型模式

即对于对象,我们通过类似复制的形式进行克隆,对于创建对象代价较大时,使用new进行创建就会使效率低下,使用原型模式就会提高效率 需要注意的就是深克隆和浅克隆

实现形式

实现Cloneable接口 重写clone方法

代码实现

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Pig implements Cloneable{
    private int weight;
    private Date birthDate;

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

public class Consumer {
    public static void main(String[] args) throws CloneNotSupportedException {
        Date date = new Date();
        Pig pig = new Pig(99,date);
        System.out.println(pig);
        System.out.println(pig.hashCode());

        Pig clone = (Pig) pig.clone();
        System.out.println(clone);
        System.out.println(clone.hashCode());

    }
}

此时结果为

Pig(weight=99, birthDate=Tue Mar 09 19:47:47 CST 2021)
382774248
Pig(weight=99, birthDate=Tue Mar 09 19:47:47 CST 2021)
382774248

假设我们在最后加上

date.setDate(999);
System.out.println(pig);
System.out.println(clone);

可以发现,pig和clone对象的date都变了,类似于深拷贝和浅拷贝,有深克隆和浅克隆之分 上面的例子就是浅克隆,如果需要深克隆,有多种方式,我们可以采用重写clone方法的形式深克隆

举例上面的例子,Pig类改写成

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Pig implements Cloneable{
    private int weight;
    private Date birthDate;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Pig pig = (Pig) super.clone();
        //对birthDate也进行clone
        pig.birthDate = (Date) this.birthDate.clone();
        return pig;
    }
}

就会变成深克隆

应用

在Spring中 配置的xml文件里,如下,scope的属性如果是prototype就是原型模式,如果是singleton就是单例模式

<bean id="user2" class="com.Cai.pojo.User" c:name="c22" c:age="22" scope="prototype"/>
<!--    singleton单例模式-->
<!--    prototype原型模式-->