设计模式-创建者模式-原型模式

文章介绍了Java中的原型模式,主要用于对象的复制。浅克隆通过实现Cloneable接口并重写clone()方法实现,而深克隆可以通过反序列化或自定义clone()处理引用类型的复制。文章提供了示例代码展示两种克隆方式的使用,并强调了深克隆中引用类型对象的不同。
摘要由CSDN通过智能技术生成

一.概述:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。

原型模式即克隆。

二.克隆的分类

浅克隆:根据一个对象创建一个新的对象,新对象中的属性,方法名都一样。对于引用类型,新对象与原对象是同一个对象,即地址值指向相同。

深克隆:根据一个对象创建一个新的对象,新对象中的属性,方法名都一样。对于引用类型,新对象与原对象不是同一个对象,即地址值指向不同。

三.使用方式

1.浅克隆

jdk已经为我们封装好了相关方法,只需要继承Cloneable接口并实现其clone()方法就行。

:一个蛋糕品牌上有很多信息,蛋糕名称,产地,品牌方,委托方等等。

但同一个品牌的不同蛋糕也就产品名称不同,其他可能都相同。如果每个名称都新建一个对象,那么就会很麻烦。此时就可以用浅克隆,克隆后再改一下产品名称就行。

代码实现

/**
 * 商品信息
 */
public class Goods implements Cloneable{

    private String name;
    //品牌
    private String brand;
    //产地
    private String place;
    //委托方
    private principal principal;

    public Goods(String name, String brand, String place, 浅克隆.principal principal) {
        this.name = name;
        this.brand = brand;
        this.place = place;
        this.principal = principal;
    }

    public void setName(String name) {
        this.name = name;
    }

    public principal getPrincipal() {
        return principal;
    }



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

    @Override
    public String toString() {
        return "Goods{" +
                "name='" + name + '\'' +
                ", brand='" + brand + '\'' +
                ", place='" + place + '\'' +
                ", principal=" + principal +
                '}';
    }
}

/**
 * 委托方
 */
public class principal {
}



/**
 * 测试(工厂类)
 */
public class MAIN {
    public static void main(String[] args) throws CloneNotSupportedException {
        Goods g1 = new Goods("抹茶蛋糕", "红跑车", "南京", new principal());
        Goods g2 = (Goods)g1.clone();
        g2.setName("巧克力蛋糕");
        System.out.println(g1==g2);
        System.out.println(g1);
        System.out.println(g2);
    }
}

测试结果:

 通过结果可发现,浅克隆除了对象不同,内部属性都相同。

2.深克隆

深克隆可以通过反序列化来实现,或者自定义clone()方法。即其中的引用类型必须要重新new。

注意事项:需要反序列化的类必须要实现Serializable接口,否则会报异常。

代码实现

/**
 * 测试(工厂类)
 */
public class MAIN {
    public static void main(String[] args) throws Exception {
        Goods g1 = new Goods("抹茶蛋糕", "红跑车", "南京", new principal());
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("object.txt"));
        objectOutputStream.writeObject(g1);
        objectOutputStream.close();
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("object.txt"));
        Goods g2 = (Goods)objectInputStream.readObject();
        g2.setName("巧克力蛋糕");
        System.out.println(g1==g2);
        System.out.println(g1);
        System.out.println(g2);
    }
}

结果:

这里通过文件流的形式进行反序列化,还可以通过转化成json字符串再转回object反序列化。通过结果可发现深克隆其引用类型不同。

总结:

原型模式适用于对象的创建非常复杂,但有着相同属性的情况。能够降低复杂度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值