原型模式通俗易懂

《JAVA与模式》之原型模式 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。在阎宏博士的《JAVA与模式》一书中开头是这样描述原型(Prototype)模式的:原型模式属于对象的创建模式。通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。这就是选型模式的用意。 阅读详情

首先也是遵从:是什么?干嘛用?怎么用三部曲。

相关详细概念网上铺天盖地,有些概念性的东西我就不复制了,只谈谈自己的理解和实现。

1、是什么?

根据字面意思都可以知道得差不多,原型模式,就是有一个原型实例,实现的话拷贝该原型创建新的实例,用的话就用新 的实例。他是创建型设计模式。
java类图
在这里插入图片描述

一共有三个角色

(1)客户(Client)角色
(2)抽象原型(Prototype)角色
(3)具体原型(Concrete Prototype)角色

分类
(1)浅拷贝:我们只拷贝对象中的基本数据类型(8种),对于数组、容器、引用对象等都不会拷贝

(2)深拷贝:不仅能拷贝基本数据类型,还能拷贝那些数组、容器、引用对象等

2、干嘛用?

1)当我们的类初始化需要消耗很多的资源时,就可以使用原型模式,因为我们的克隆不会执行构造方法,避免了初始化占有的时间和空间。

(2)一个对象被其她对象访问,并且能够修改时,访问权限都无效了,什么都能修改。

3、怎么用?

(1)jdk的clone方法
实现Cloneable 接口
如果有复杂对象重写clone方法,然后克隆复杂对象
实现具体原型方法
开始克隆

4、使用案例

上帝造人
首先创建一个抽象人,就是具体人的原型。
然后开始克隆

在这里插入图片描述

原型人

public class BaseHumans implements Cloneable {
    private Map<String, String> eyes;
    private String mouth;
    private String head;
    private Map<String, String> hands;
    private Map<String, String> foots;
    private long height;
    //....

    public Map<String, String> getEyes() {
        return eyes;
    }

    public void setEyes(Map<String, String> eyes) {
        this.eyes = eyes;
    }

    public String getMouth() {
        return mouth;
    }

    public void setMouth(String mouth) {
        this.mouth = mouth;
    }

    public String getHead() {
        return head;
    }

    public void setHead(String head) {
        this.head = head;
    }

    public Map<String, String> getHands() {
        return hands;
    }

    public void setHands(Map<String, String> hands) {
        this.hands = hands;
    }

    public Map<String, String> getFoots() {
        return foots;
    }

    public void setFoots(Map<String, String> foots) {
        this.foots = foots;
    }

    public long getHeight() {
        return height;
    }

    public void setHeight(long height) {
        this.height = height;
    }

    public BaseHumans(Map<String, String> eyes, String mouth, String head, Map<String, String> hands, Map<String, String> foots, long height) {
        this.eyes = eyes;
        this.mouth = mouth;
        this.head = head;
        this.hands = hands;
        this.foots = foots;
        this.height = height;
    }

    @Override
    public String toString() {
        return "BaseHumans{" +
                "eyes=" + eyes +
                ", mouth='" + mouth + '\'' +
                ", head='" + head + '\'' +
                ", hands=" + hands +
                ", foots=" + foots +
                ", height=" + height +
                '}';
    }

    public BaseHumans clone() {
        BaseHumans baseHumans = null;

        try {
            baseHumans = (BaseHumans) super.clone();
            baseHumans.setEyes((Map<String, String>) ((HashMap) this.eyes).clone());
            if (this.hands != null) {
                baseHumans.setHands((Map<String, String>) ((HashMap) this.hands).clone());
            }
            if (this.foots != null) {
                baseHumans.setFoots((Map<String, String>) ((HashMap) this.foots).clone());
            }
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return baseHumans;
    }

}

男人原型

import java.util.Map;

public class Men extends BaseHumans {
    //
    private String features = "有鸡鸡";

    public Men(Map<String, String> eyes, String mouth, String head, Map<String, String> hands, Map<String, String> foots, long height) {
        super(eyes, mouth, head, hands, foots, height);
        System.out.println("我是原型人构造方法");
    }

    public String getFeatures() {
        return features;
    }

    public void setFeatures(String features) {
        this.features = features;
    }

    public void show(String name) {
        System.out.println(name+"人的信息");
        System.out.println(this.getFeatures());
        System.out.println(this.getEyes());
    }
}

女人的原型

public class Women extends BaseHumans {
    private String features = "没鸡鸡";

    public Women(Map<String, String> eyes, String mouth, String head, Map<String, String> hands, Map<String, String> foots, long height) {
        super(eyes, mouth, head, hands, foots, height);
        System.out.println("我是原型人构造方法");
    }

    public String getFeatures() {
        return features;
    }

    public void setFeatures(String features) {
        this.features = features;
    }

    public void show(String name) {
        System.out.println(name+"人的信息");
        System.out.println(this.getFeatures());
        System.out.println(this.getEyes());
    }
}

上帝开始造人

import java.util.HashMap;
import java.util.Map;

public class CreateHuman {
    public static void main(String[] args) {
        //男人原型
        Map<String, String> eyes = new HashMap<>();
        eyes.put("1", "左眼");
        eyes.put("2", "右眼");
        String mouth = "大嘴巴";
        Men men = new Men(eyes, mouth, null, null, null, 170);
        for (int i = 0; i < 10; i++) {
            Men men1 = (Men) men.clone();
            men1.show(i + "号人");
        }

        Women women = new Women(eyes, mouth, null, null, null, 170);
        for (int i = 0; i < 10; i++) {
            Women women1 = (Women) women.clone();
            women1.show(i + "号人");
        }

    }
}

在这里插入图片描述

项目管理原型法说明 原型法的基础 知识 介绍,适用初学者,可以大概了解。 立即下载

相关推荐

网格聚类 Grid Clustering/Grid-based Clustering

本文主要简单介绍了网格聚类的基本概念,优缺点,应用场景,建模时的注意事项,评价指标,实现方法,python示例和模型参数等。

JasonH2021的博客 4827

什么是原型模式(Prototype)?

世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。 意图 通过克隆拷贝一个与原对象内容相同但是地址不同的对象。 类图 实例 class Shape implements Cloneable { private String name; public Shape getClone () { try { return (Shape)this.clone(); } catch (CloneNo.

我的博客 713

【DSP】【工程实战】从零构建C6678多核工程:CCS环境配置与启动模式详解

本文详细介绍了在CCS开发环境中从零构建TMS320C6678多核DSP工程的完整流程。内容涵盖KeyStone架构解析、工程创建、基础代码编写、链接命令文件配置、仿真器调试,并重点深入讲解了包括I2C EEPROM在内的多种一级启动模式原理与配置方法,为开发者提供了一套清晰、可复用的实战指南。

weixin_29164185的博客 416

JavaScript中原型对象的彻底理解

下一篇 继承中的原型链的理解 一、什么是原型 原型是Javascript中的继承的基础,JavaScript的继承就是基于原型的继承。 1.1 函数的原型对象 ​ 在JavaScript中,我们创建一个函数A(就是声明一个函数), 那么浏览器就会在内存中创建一个对象B,而且每个函数都默认会有一个属性 prototype 指向了这个对象( 即:prototype的属性...

完善飞跃 5万+

《玩儿起来吧》MATLAB 实时图像处理系列(一二三四)

大家学了图像处理之后,是不是就想学以致用。而要用于生活中,最好的方式就是和摄像头搭配,实现实时图像处理。今天就给大家分享MATLAB实时图像处理的基础方法,希望能帮你快速入门。

HPC_ZY 1万+

ANSYS APDL 异类单元连接实战:MPC方法在壳-实体装配中的应用

本文详细介绍了在ANSYS APDL中使用MPC方法实现壳单元与实体单元高效连接的技术要点。通过分析工程仿真中的常见需求,阐述了MPC方法在解决异类单元连接问题上的优势,包括网格独立性、自由度耦合和载荷传递等特性,并提供了具体的APDL命令流操作示例和实用经验技巧。

weixin_33391446的博客 178

原型的通俗理解。

原型:原型是function对象的一个属性,它定义了构造函数构造出来的对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。原型也是对象。 实例访问一个属性,如果自身没有,则去看原型上有没有。 系统自带的属性constructor:通过这个属性可以到实例的构造器。另外也可以手动改变这个属性值。 ...

qq_39224105的博客 336

Vivado IP核:AXI Uartlite的使用经验分享

1. IP基本设置 在Vivado中,打开IP Catalog,搜索“uart”: 双击“AXI Uartlite”,进入IP配置界面: 这里可以配置IP的具体参数,设置时钟频率、波特率等,完成后,生成IP即可。 2. IP的时序特点 点击下面的链接可以下载该IP核的官方指导文档: https://china.xilinx.com/support/documentation/ip_docume...

weixin_43265132的博客 1万+

原型模式(Prototype Pattern)

原型模式(Prototype Pattern) 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 克隆羊问题 现在有一只羊tom,姓名为: tom,年龄为: 1, 颜色为:白色,请编写程序创建和tom羊属性完全相同的10只羊。 案例一:传统方式 public class Sheep { private String name; private int age; private String colo

jsxllht的博客 9641

Cadence PCB仿真使用Allegro PCB SI S参数配置方法图文教程

S参数即S-Parameter是指散射参数,描述信号在传输线中的正反向传输和正反向反射的情况。本文讲述在使用Allegro PCB SI进行信号完整性仿真前,S参数的配置方法。

fydar的博客 2177

第3章: MMU Interval Notifier 区间通知器的核心原理⭐

摘要:区间级内存通知机制分析 本文分析了Linux内核中区间级内存通知机制(mmu_interval_notifier)的设计原理与实现。该机制针对传统全局通知(mmu_notifier)存在的性能开销大、无法精确控制等问题,通过引入区间树(Interval Tree)实现精确匹配,仅当内存变化与注册区间重叠时才触发回调。核心优势包括:1)O(log n + k)的高效查找性能;2)支持独立管理各内存区间;3)实现高并发处理不同区间的失效事件。

图形/计算GPU的驱动与虚拟化技术分享园地 2016

原型模式(Prototype Pattern)-(最通俗易懂的案例)

1.案例引入——克隆羊 相信大家都听过克隆羊Dolly的故事,现在我们有这样一个需求:给你一头羊,像克隆那样我们需要创建出来10只一模一样的羊,有人说这个简单,直接new不就完事儿了吗,于是上代码: Sheep public class Sheep { private String name; private Integer age; public String getN...

世银的博客 812

【Network Management】AUTOSAR局部网络管理从0到1配置实践

AUTOSAR局部网络管理从0到1配置实践

qq_36056498的博客 2913

设计模式之-原型模式,快速掌握原型模式,通俗易懂的理解原型模式以及使用场景

原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新的对象,而无需通过调用构造函数来创建。原型模式通过克隆操作来创建对象,提供了一种更加灵活和高效的对象创建方式。在现实生活中,原型模式的例子可以是制作玩具的模具。模具(原型对象)定义了玩具的形状和细节,而根据模具可以快速复制出多个相同的玩具(克隆对象)。

咖啡程序员 1233

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

通俗易懂设计模式解析——原型模式

前言   前面几章我们介绍了创建型设计模式的部分内容,今天我要说的是创建型设计模式中最后一个——原型模式,原型模式是创建型模式中的一种较为特殊的模式,有个最大的特点是克隆一个现有的对象,在我们日常软件系统开发中,某些对象的创建new即为复杂,而且我们需要使用多个相同的实例,这样如果我们依旧使用new去进行创建。就会增加系统的复杂度和增加代码之间的耦合度。但是我们使用前面介绍的工厂模式的...

dingxian9983的博客 241

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

通俗易懂的java设计模式之 --原型模式

原型模式

zmxnn的博客 175

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

通俗易懂的java设计模式(7)-原型模式

原型模式提供了一种创建对象的模式,。用一个很生动形象的例子:孙悟空拔出一根猴毛,变出其他和自己一模一样的小孙悟空,在这里,原型实例就是孙悟空,拔出的猴毛通过拷贝孙悟空的外表特征,变成了其他小孙悟空。在java中通过实现 实现 Cloneable 接口,并且重写clone方法,在创建新对象时候,调用。

qq_28356977的博客 769

设计模式之原型模式(通俗易懂--代码辅助理解【Java版】)

创建型模式:工厂方法、抽象方法、建造者、原型、单例。结构型模式有:适配器、桥接、组合、装饰器、外观、享元、代理。行为型模式有:责任链、命令、解释器、迭代器、中介、备忘录、观察者、状态、策略、模板方法、访问者。常用设计模式:单例模式、工厂模式、代理模式、策略模式&模板模式、门面模式、责任链模式、装饰器模式、组合模式、builder模式。这种情况就是浅拷贝,java只拷贝你指定的对象,至于你指定的对象里面的别的对象,它不拷贝,还是把引用给你,共享变量,这是一种非常不安全的方式,需要特别注意。

qq_45929019的博客 1621

厚积薄发打卡Day32 :[kuangStudy] GoF23通俗易懂的设计模式之 <原型模式>

前言: 视频教程:狂神说Java之通俗易懂的23种设计模式 什么是设计模式? 设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。 它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的 解决方案==> 一种思维,一种态度,一种进步 1995年,GoF(Gang of Four,四人组/四人帮)合作出版了《设计模式:可复用面向对象软 件的基础》一书,共收录了23种设计模式,从此树立了软件设计模式领域的里程碑,人称 【GoF

COOLGWAYNE_TECH_BLOG 277

Java设计模式系列 原型模式解读(超通俗易懂)

在Java中,对象的创建通常是使用关键字“new”进行创建的,但是如果使用原型模式,我们可以通过**克隆**现有对象来创建新的对象,而不需要重新实例化和初始化新的对象。

weixin_45663027的博客 171

通俗易懂的设计模式之原型模式

原文连接 关注公众号:阿达学编程 带你一起学习设计模式

DATKI的博客 115

23种设计模式之原型模式(PrototypePattern)---codesheep史上最通俗易懂

看了codesheep的文章再加上自己的理解,感觉自己起飞了 一、值类型 vs 引用类型 这两个概念的准确区分,对于深、浅拷贝问题的理解非常重要。 正如Java圣经《Java编程思想》第二章的标题所言,在Java中一切都可以视为对象! 所以来到Java的世界,我们要习惯用引用去操作对象。在Java中,像数组、类Class、枚举Enum、Integer包装类等等,就是典型的引用类型,所以操作时一般来说采用的也是引用传递的方式; 但是Java的语言级基础数据类型,诸如int这些基本类型,操作时一.

fairy767190的博客 394

《设计模式之禅》书评

东方友诚 743

23 种设计模式的通俗解释

23 种设计模式的通俗解释,虽然有点污,但是秒懂 01 工厂方法 追 MM 少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是 MM 爱吃的东西,虽然口味有所不同,但不管你带 MM 去麦当劳或肯德基,只管向服务员说「来四个鸡翅」就行了。麦当劳和肯德基就是生产鸡翅的 Factory 工厂模式:客户类和工厂类分开。 消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。 02 建造者模式 MM 最爱听的就是「我爱你

weixin_42778796的博客 165

原型模式:我就是另一个你

这里写目录标题原型模式的定义原型模式的通用代码原型模式的应用场景原型模式的优缺点原型模式的注意事项 克隆(clone)一词想必都不陌生,是一种利用体细胞进行无性繁殖的一种技术。本质上来说,就是一种原样复制,但是站在伦理的角度,此类技术还有比较大的争议,暂且不论。 接下来,介绍的这种原型模式,你可以叫它克隆模式,也可以叫它复制模式,其本质上就是一种对象拷贝。是一种不通过new关键字产生对象,而是通过对象复制来实现的一种模式。 原型模式的定义 官方定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建

weixin_30484149的博客 217

C++设计模式:原型模式(Prototype)

原型模式是一种**创建型设计模式**,它让我们可以通过复制(克隆)一个现有的对象,快速生成一个新的对象,而不需要再次通过类的实例化来创建。

专注于 Qt/C++ 应用开发和机器视觉领域的开源项目分享。期待与您共同进步! 1681
上一篇: 观察者模式深入理解
下一篇: 工厂模式通俗易懂
沐果果
博客等级 码龄10年 19粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值