Jianwoo中的设计模式(6) — 原型模式

前言

什么是原型模式呢,就是通过已有对象实例去创建同类型对象并且使用已有对象实例数据的拷贝来创建新对象,说简单点就是克隆
克隆一般有两种,一种是浅克隆,另一种是深克隆。什么是浅克隆,就是通过实现Cloneable接口,然后重写克隆方法把当前类的基本对象重新赋值到新对象的形式,也叫表面克隆,这种克隆适合参数不多层次不深的对象,但是对于那种对象内还有对象,层次内对象还有别的对象的情况,浅克隆很明显并不合适,这篇文章主要讲深克隆所代表的原型模式,以及克隆中所遇到的一些问题

简物中的应用场景

在简物性能优化这篇文章中,提到了详情界面的数据和UI在不可见时候要释放资源,以节省内存资源,这样即使打开几十个上百个界面,也是如丝滑一般顺畅,当我们返回界面时就要重新加载资源,那我们为了保护原始对象不受界面回收的影响可以将原始数据克隆一份作为母体数据,这样不管什么时候返回我们都拿原始数据的克隆对象去恢复界面,那我们如何实现这种深克隆,这里要用到序列化和反序列化

序列化和反序列化

概念:在Java中把对象转换为字节序列的过程叫做序列化,反过来把字节序列转化成对象的过程就叫反序列化
注意:凡是需要被序列化的对象,不管是直接对象还是包含对象,均需要实现Serializable接口
通过序列化我们可以把对象序列化到本地也可以序列化到内存,根据不同的场景采取不同的做法,简物中的克隆是将对象序列化到内存,在实体类中,我们只要随意定义一个方法写序列化和反序列化方法即可,这里是clone方法

    public static class SaleDetail implements Serializable{
        int goods_id;
        String image;
        String title;
        String describe;
        String price;
        String discount_price;
        List<Tag> tags;
        List<Skus> skus;
        List<Products> products;
        List<LinkGoods> link_goods;
        String[] images;
        int is_mark;

        public void clear(){
            image = null;
            title = null;
            describe = null;
            price = null;
            discount_price = null;
            tags.clear();
            skus.clear();
            products.clear();
            link_goods.clear();
            tags = null;
            skus = null;
            products = null;
            link_goods = null;
            images = null;
        }

        @Override
        public SaleDetail clone(){
            SaleDetail saleDetail = null;
            try{
                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
                objectOutputStream.writeObject(SaleDetail.this);
                ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
                ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
                saleDetail = (SaleDetail) objectInputStream.readObject();
            }catch (IOException|ClassNotFoundException e){

            }
            return saleDetail;
        }

        ...

}

看到没,这就是序列化对象到内存的过程,是不是很简单,没有什么复杂的地方,甚至都不需要我多说了,聪明的你应该能理解
那如果有时候有些对象引用我们不需要序列化怎么办呢,比如对象里面有一个Context引用,那这个时候我们可以用transient修饰这个对象,这个对象就会被排除在序列化之外

transient Context context;

最后的调用就是

    @Override
    public void getSaleDetailSucess(SaleDetailBean.SaleDetail saleDetail) {
        if(saleDetail == null){
            return;
        }
        this.mSaleDetail = saleDetail;
        this.mSaleDetailCopy = saleDetail.clone();
        ...
    }

然后拿mSaleDetailCopy去操作就不会影响到saleDetail啦,这就是深克隆

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容

  • JAVA序列化机制的深入研究 对象序列化的最主要的用处就是在传递,和保存对象(object)的时候,保证对象的完整...
    时待吾阅读 10,825评论 0 24
  • 定义 原型模式属于对象的创建模式。通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建...
    步积阅读 1,326评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 1大同小异的工作周报 Sunny软件公司一直使用自行开发的一套OA (Office Automatic,办公自动化...
    justCode_阅读 1,137评论 0 3
  • 人处在某挫折中的时候,一味的悲伤、萎靡不振就等于在这个伤口上 再撒把盐。心态要及时的调整。四个字是那个时候的体会“...
    Ruuush阅读 172评论 0 0