原型模式、建造者模式

原型模式

定义:原型实例指定创建对象的种类,通过拷贝这些原型创建新的对象
不需要知道创建细节,不调用构造函数;即不通过new,通过方法创建一个相同对象;
new每一个参数都需要手动设置,clone不走构造方法,
原型模式一般两种

浅克隆

实现cloneable接口,没有clone方法,实现在Object,因为Object是所有的父类,clone是一个native方法;
TODO clone对象增加list属性验证
引用对象更改,克隆的对象也会随之更改
没有引用对象或者引用对象对对象不会有影响,可以用浅克隆;浅克隆用的比较少

深克隆

流读取序列化

序列化,实现序列化接口
TODO 类中手写一个深克隆(流读写)方法实现

    public Object deepClone() throws IOException, ClassNotFoundException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream ops = new ObjectOutputStream(baos);
        ops.writeObject(this);
        ops.flush();
        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bais);
        Object o = ois.readObject();
        return o;
    }

通过json的api

TODO 通过json实现

public class Test {
    public static void main(String[] args) throws CloneNotSupportedException, IOException, ClassNotFoundException {
        List<String> hobbies = new ArrayList<>();
        hobbies.add("chi");
        hobbies.add("he");
        Student s1 = new Student(0,"liqi",hobbies);
        Student student = JSON.parseObject(JSON.toJSONString(s1), Student.class);
        System.out.println(s1 == student);
    }
}

与单例

原型与单例模式是互斥的

原型模式源码应用

实现了cloneable接口的类,实现cloneable的都是浅克隆
如果容器里面是基本类型就是深克隆,如是引用类型又是浅克隆
ArrayList的clone
HashMap的clone

深克隆实现2

引用对象都实现clone方法,一般不通过这种方法硬编码,序列化会简单直接点

原型模式应用很少
jdk实现了浅克隆;spring、Apache都实现了对象复制类

学习设计模式不是为了使用,为了多一种选择

优缺点

基于内存流读取,简单快速深克隆

必须要有克隆方法,违反开闭原则

实现cloneable的都是浅克隆,深克隆一般需要自己实现

建造者模式

将复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示
如example.createCritira().andNoEqualsTo()等

适用于创建需要很多步骤,步骤顺序不一定固定
构建和表示分离,每个方法构建一个属性,也可以链式编程
可以不关心顺序

优缺点

封装性好,创建使用分离;扩展性好
产生多余的builder对象;且要跟随创建的类一起修改

和工厂模式

工厂模式创建的对象都一样;建造者模式创建更复杂,且定制化,可创建不一样的对象;

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容