11.什么档次的原型模式和我写的一样

这篇具有很好参考价值的文章主要介绍了11.什么档次的原型模式和我写的一样。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

11.什么档次的原型模式和我写的一样,设计模式,原型模式
在《生化危机》系列电影中,克隆人是个频频出现的话题。保护伞公司为了需求复制出另一个战力相当的战士Alice,不惜克隆成百上千个Alice,然而直到最后,非但没有真正克隆出另一个完美的Alice,就连Alice自己也被证实是保护伞董事的一个克隆人。

克隆人一直是饱含伦理争议的话题,但是在软件设计领域,克隆思想却很受欢迎。软件旨在用程序替代人工去做重复性的工作。归根结底,“懒”是推动软件发展的重要助力,原型模式就是克隆思想的重要应用之一。


一言

原型实例指定创建对象的种类,通过拷贝这些原型创建新的对象。


概述

原型模式是一种创建型设计模式,它允许一个对象再创建一个可定制的对象而无需知道如何创建的细节。就像爱丽丝直到最后才指导自己也是克隆人一样,实例本身是不关注
创建实例的细节的。


原理

通过将一个原型对象传给要发动创建的对象,要发动创建的对象通过请求原型对象拷贝它们自己来实施创建,即bean.clone()。
11.什么档次的原型模式和我写的一样,设计模式,原型模式


欢迎来到保护伞公司

11.什么档次的原型模式和我写的一样,设计模式,原型模式

职员7568你好,欢迎你加入保护伞公司,徐江博士交给你的第一个任务是,编写代码,复制十个爱丽丝,加油!

循规蹈矩的豪赌

小职员7568稍加思索便写出了如下代码:

反例代码

Alice原型

public class Alice{
    private String name;
    private int age;
    private String skill;

    public Sheep(String name, int age, String skill) {
        this.name = name;
        this.age = age;
        this.skill= skill;
    }
    
	//setter & getter
	
    @Override
    public String toString() {
        return "Alice{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", skill='" + skill+ '\'' +
                '}';
    }

驱动机

public class Client {
    public static void main(String[] args) {
        Alice alice= new Alice ("alice", 18, "极强的战斗天赋");
        Alice alice1= new Alice ("alice", 18, "极强的战斗天赋");
        Alice alice2= new Alice ("alice", 18, "极强的战斗天赋");
        Alice alice3= new Alice ("alice", 18, "极强的战斗天赋");
        Alice alice4= new Alice ("alice", 18, "极强的战斗天赋");

        System.out.println(alice);
        System.out.println(alice1);
        System.out.println(alice2);
        System.out.println(alice3);
        System.out.println(alice4);
    }
}

不一会,职员7568就高呼自己完成了任务。
徐江博士看了看代码,吩咐手下,“拖出去喂丧尸,什么档次跟我在一个公司工作?”

11.什么档次的原型模式和我写的一样,设计模式,原型模式
所以,保护伞公司职员-1。

问题分析

那么究竟是什么问题导致博士那么生气呢?
首先,要肯定上述代码的优势,简单易操作。但是,在创建新对象的时候总是需要重新获取原始对象的属性,如果创建的对象比较复杂时,效率会及低。而且每一次都需要重新初始化对象,灵活性太低。

浅拷贝

“老,老板,我有一个不太成熟的思路,不知道当讲不当讲”,职员7569瑟瑟发抖。
“ 讲!”
“Java中Object类是所有类的根类,Object类提供了一个clone()方法,该方法可以将一个Java对象复制一份,但是需要实现clone的Java类必须要实现一个接口cloneable该接口表示该类能够复制且具有复制的能力。通过这种方式,或许…”
徐博士听着这段构想,嘴角露出了不易察觉的微笑:
“很好,但是我有一个要求,我要让这些爱丽丝们做朋友”

代码实现

public class Alice implements Cloneable{
    private String name;
    private int age;
    private String skill;
    public Alice friend;

    public Alice (String name, int age, String skill) {
        this.name = name;
        this.age = age;
        this.skill= skill;
    }
    
    @Override
    protected Object clone(){
        Alice alice = null;
        try {
            alice = (Alice ) super.clone();
        }catch (Exception e){
            System.err.println(e.getMessage());
        }
        return alice ;
    }
                               
    @Override
    public String toString() {
        return "Alice{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", skill='" + skill+ '\'' +
                '}';
    }
}

徐博士的检查

徐博士看了看代码,继续吩咐手下,“拖出去,喂丧尸,什么档次跟我待一个公司。”
职员7569高呼:“我不服,我的代码有什么问题?”
徐博士看了看他涨红的面庞,缓缓的将Alice实例的friend属性的哈希值打印了出来,小职员呆住了,再没有了一丝力气。

11.什么档次的原型模式和我写的一样,设计模式,原型模式
保护伞公司职员-1

在实体属性发生变更时,原型模式可以以很小的改动代价实现对象的拷贝。但是,上述实现的克隆并不会将本体的对象属性做到真正意义的克隆,只是将对象的引用复制了多份,所以我们称之为浅克隆。

深拷贝

职员7570汗流浃背了,因为下一个就轮到他来解决这个问题,他拼命的思考,终于,他起身了。
“博士,我想到了。我们复制对象的所有基本数据类型的成员变量值,为所有引用数据类型的成员变量申请存储空间,并复制每个引用数据类型成员变量所引用的对象,直到该对象可达的所有对象。也就是说,对象进行深拷贝要对整个对象进行拷贝。”
徐博士抬头看了看这个少年:“继续”
小职员咽了咽口水:“对于深拷贝的实现方式,我想可以通过重写clone方法…或者 ,或者通过对象实例化实现深拷贝。”
徐博士又深深的看了一言面前这个侃侃而谈的少年:“看来你不是个草包,写写看看吧。”
11.什么档次的原型模式和我写的一样,设计模式,原型模式

代码实现

public class DeepCloneAbleTarget implements Serializable,Cloneable{
    private static final long serivalVersionID = 1L;
    private String cloneName;
    private String cloneClass;
    public DeepCloneAbleTarget(String cloneName, String cloneClass) {
        this.cloneName = cloneName;
        this.cloneClass = cloneClass;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
public class DeepProtoType implements Serializable,Cloneable {
    public String name;
    public DeepCloneAbleTarget deepCloneAbleTarget;
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Object deep = null;
        deep =super.clone();
        DeepProtoType deepProtoType  =(DeepProtoType) deep;
        deepProtoType.deepCloneAbleTarget = (DeepCloneAbleTarget) deepCloneAbleTarget.clone();
        return deepProtoType;
    }
    public Object deepClone(){
        ByteArrayOutputStream bos = null;
        ObjectOutputStream oos = null;
        ByteArrayInputStream bis = null;
        ObjectInputStream ois = null;

        try {
            bos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(bos);
            oos.writeObject(this);
            bis = new ByteArrayInputStream(bos.toByteArray());
            ois = new ObjectInputStream(bis);
            DeepProtoType copyObj = (DeepProtoType) ois.readObject();
            return copyObj;
        }catch (Exception e){
            System.err.println(e.getMessage());
            return null;
        }finally {
            try {
                bos.close();
                oos.close();
                bis.close();
                ois.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

创建新的对象比较复杂时,可以利用原型模式简化对象的创建过程,同时也能够提高效率。不用重新初始化对象,而是动态地获得对象运行时的状态。如果原始对象发生变化(增加或者减少属性),其它克隆对象的也会发生相应的变化无需修改代码。

但是在实现深克隆的时候可能需要比较复杂的代码。同时,需要为每一个类配备一个克隆方法,这对全新的类来说不是很难,但对已有的类进行改造时,需要修改其源代码,违背了ocp原则。

好啦,今天在保护伞公司的打工之旅就到此为止,祝各位好运。


关注我,共同进步,每周至少一更。——Wayne文章来源地址https://www.toymoban.com/news/detail-812388.html

到了这里,关于11.什么档次的原型模式和我写的一样的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 我写了本开源书:《3D编程模式》

    大家好,我写了本开源书,罗列了我从自己的实战项目中提炼出来的关于3D编程(主要包括“3D引擎/游戏引擎”、“编辑器”开发)的各种编程模式 本书的在线阅读地址在这里:在线阅读 本书的源码在Github中,欢迎star,感恩您:Github地址 本书的写作花了我300多个小时,将近

    2024年02月05日
    浏览(66)
  • 设计模式之不一样的责任链模式

    责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它通过将请求的发送者和接收者解耦,使多个对象都有机会处理请求。在这个模式中,请求沿着一个处理链依次传递,直到有一个对象能够处理它为止。 本文将详细介绍责任链模式的概述、应用场景以及代码示

    2024年02月07日
    浏览(52)
  • DP读书:不知道干什么就和我一起读书吧——以《鲲鹏处理器 架构与编程》中鲲鹏软件的构成为例

    虽然清楚知识需要靠时间沉淀,但在看到自己做不出来的题别人会做,自己写不出的代码别人会写时还是会感到焦虑怎么办? 你是否也因为自身跟周围人的差距而产生过迷茫,这份迷茫如今是被你克服了还是仍旧让你感到困扰?来分享一下吧! 我就读了几天书,就这样了。

    2024年02月09日
    浏览(43)
  • 二十三种设计模式全面解析-原型模式进阶之原型管理器:集中管理对象原型的设计模式之道

    在软件开发中,我们经常需要创建和复制对象。然而,有时候直接创建对象可能会导致性能下降或代码重复。为了解决这些问题,原型模式应运而生。而使用原型管理器(Prototype Manager)来集中管理原型对象可以进一步提高灵活性和可维护性。本文将详细介绍原型管理器的用

    2024年02月07日
    浏览(56)
  • win11电脑不会自动休眠?睡眠和休眠可是不一样的。

    背景: 昨天刚拿到新电脑,是win11系统。之前用的win10的本子,为了第二天快速开发,我前一天下班前往往会直接合上笔记本盖,它就自动休眠了。 然而win11并不和win10一样!!!win11貌似是只是睡眠,第二天早上一来就听见新电脑的风扇呼呼响。直接强制关机,再重启才恢复

    2024年04月27日
    浏览(37)
  • 重温设计模式 --- 原型模式

    原型模式 是一种创建型设计模式,它允许我们创建一个对象的副本,而不需要显式地使用构造函数来创建一个新的对象。这种模式通常用于创建那些具有复杂创建过程或需要大量资源的对象。 在原型模式中,我们首先定义一个原型接口,该接口包含一个克隆方法。然后我们

    2024年02月13日
    浏览(49)
  • 设计模式系列-原型模式

    一、上篇回顾 上篇创建者模式中,我们主要讲述了创建者的几类实现方案,和创建者模式的应用的场景和特点,创建者模式适合创建复杂的对象,并且这些对象的每 个组成部分的详细创建步骤可以是动态的变化的,但是每个对象的组装的过程来说可能是相对固定的或者说是

    2024年02月09日
    浏览(43)
  • 设计模式-原型模式

    目录 一、传统方式 二、原型模式  三、浅拷贝和深拷贝 克隆羊问题: 现在有一只羊tom,姓名为: tom,年龄为: 1,颜色为: 白色,请编写程序创建和tom羊属性完全相同的10只羊。 传统的方式的优缺点: 简单易操作。优点是比较好理解。 在创建新的对象时,总是需要重新获取原

    2024年02月16日
    浏览(36)
  • 设计模式5:原型模式

    Prototype Pattern 如果对象的创建成本比较大,可以基于已有的原型对象通过来创建新的对象,节省创建时间。 设计模式之原型模式 实现Cloneable接口的方式。这里就不展开分析浅克隆和深克隆了,后面再专门分析浅克隆和深克隆,不影响对原型模式的理解。 用序列化实现创建对

    2024年02月11日
    浏览(50)
  • 设计模式(6)原型模式

    一、介绍 Java中自带的原型模式是clone()方法。该方法是Object的方法,native类型。他的作用就是将对象的在内存的那一块内存数据一字不差地再复制一个。我们写简单类的时候只需要实现Cloneable接口,然后调用Object::clone方法就可实现克隆功能。这样实现的方式是浅拷贝。  1、

    2024年02月12日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包