意图

原型模式是创建型设计模式,可以复制已存在的对象而无需依赖它的类。

问题

假如现在有一个对象,我们想完全复制一份新的,我们该如何做?

  1. 创建同一个类的新对象
  2. 遍历所有已存在对象的值,然后将他们的值复制到新对象。

很好,但是我们会发现存在如下问题:

  1. 该对象的值并不一定全对对外开放,比如Java中的private,外部无法访问。
  2. 使用这种办法必须知道该对象所属的类而且依赖这个类。
  3. 有些时候我们只知道该对象实现的接口,而不是具体的实现类。

解决

这个时候我们就需要原型模式。原型模式将克隆过程委托给被克隆的对象。该模式为所有支持克隆的对象声明一个公共接口,这个接口允许克隆一个对象,而不必将代码和该对象的类耦合。通常,这样的接口只包含一个克隆方法。

克隆方法的实现在所有类中都非常相似。该方法创建当前类的一个对象,并将旧对象的所有字段值转移到新对象中。这样就可以复制私有字段,因为大多数编程语言都允许对象访问属于同一类的私有字段。

结构

原型模式包含如下角色

  • Prototype:它是声明克隆方法的接口,是所有具体原型类的公共父类,可以是抽象类也可以是接口,甚至还可以是具体实现类。
  • ConcretePrototype:它实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象

实例

在Java中,所有的类都继承了java.lang.Object。Object提供了clone方法能实现Java对象复制。
我们只需注意两点即可。

  1. 实现克隆的Java类必须实现一个标识接口Cloneable,表示这个Java类支持被复制。如果没有实现这个接口但调用了clone()方法,Java编译器将抛出一个CloneNotSupportedException异常。
  2. 浅克隆和深克隆
    java的clone函数只是“浅克隆”,也就是仅对变量值做复制。如果是引用变量,其内容指向的内存地址是不变的。

参考文献

https://refactoring.guru/design-patterns/prototype

大白话原型模式(Prototype Pattern)的更多相关文章

  1. Net设计模式实例之原型模式( Prototype Pattern)

    一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kin ...

  2. 二十四种设计模式:原型模式(Prototype Pattern)

    原型模式(Prototype Pattern) 介绍用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象.示例有一个Message实体类,现在要克隆它. MessageModel usin ...

  3. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...

  4. 设计模式系列之原型模式(Prototype Pattern)——对象的克隆

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  5. 六个创建模式之原型模式(Prototype Pattern)

    定义: 使用原型实例指定创建对象的种类,并通过拷贝这个原型的属性创建新的对象. 结构图: Prototype:抽象原型类,声明克隆方法的接口,并是所有原型类的公共父类.在Java中,Object类为该 ...

  6. 原型模式(Prototype Pattern)

    用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 它通过复制一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的原型,这个原型是可定制的. 原型模式多用于创建复杂 ...

  7. C#设计模式——原型模式(Prototype Pattern)

    一.概述 在软件开发中,经常会碰上某些对象,其创建的过程比较复杂,而且随着需求的变化,其创建过程也会发生剧烈的变化,但他们的接口却能比较稳定.对这类对象的创建,我们应该遵循依赖倒置原则,即抽象不应该依 ...

  8. 2.6 《硬啃设计模式》第8章 复制不是很难 - 原型模式(Prototype Pattern)

    案例: 某即时战略游戏,你训练出来各种很强的战士. 为了增加游戏的可玩性,增加了一种复制魔法.实施该魔法,可以复制任意的战士. 你会怎样考虑这个设计? 在继续阅读之前,请先认真思考并写出你的设计,这样 ...

  9. 原型模式(Prototype Pattern)--对象的克隆

    定义:使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象; 原型类的核心在于如何实现克隆方法: 能够实现克隆的Java类必须实现一个标识接口Cloneable,表示这个类支持被复制; 通 ...

  10. 设计模式——原型模式(Prototype Pattern)

    原型模式:用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象. UML 图: 原型类: package com.cnblog.clarck; /** * 原型类 * * @author c ...

随机推荐

  1. windows下如何安装Composer?

    Composer 不是一个包管理器,它仅仅是一个依赖管理工具.它涉及 "packages" 和 "libraries",但它在每个项目的基础上进行管理,在你项目 ...

  2. 在spring security3中使用自定义的MD5和salt进行加密

    首先看代码: <authentication-manager alias="authenticationManager"> <authentication-pro ...

  3. VScode快捷键(最全)

    按 Press 功能 Function Ctrl + Shift + P,F1 显示命令面板 Show Command Palette Ctrl + P 快速打开 Quick Open Ctrl + ...

  4. springboot多对一关系映射

    原文:https://blog.csdn.net/h993438890/article/details/89146483 spring boot项目的创建省略创建两张表t_user 字段 主键id,u ...

  5. Online Classification

    Another challenging trend in Internet evolution is the tremendous growth of the infrastructure in ev ...

  6. dotnet 判断程序当前使用管理员运行降低权使用普通权限运行

    有一些程序是不想通过管理员权限运行的,因为在很多文件的读写,如果用了管理员权限程序写入的程序,其他普通权限的程序是无法直接访问的.本文告诉大家如何判断当前的程序是通过管理员权限运行,然后通过资源管理器 ...

  7. IdentityServer4 Clients

    原文地址 Clients 的定义 Client是指那些从 identityserver获取 token的应用 通常需要为client定义下面通用的设置 唯一的client id secret, 如果需 ...

  8. 学习Java第二周

    这是学习java的第二周,又这样不知不觉的结束了 上周想要学习的这一周也都做到了,可是觉得进度有些慢了,学习了: 1. 接口和抽象类: 2. 集合与数组: 3. 方法的定义: 4. 递归算法: 5.对 ...

  9. 一点资讯 视频抓取 phantomjs

    # _*_ coding: utf- _*_ """ 思路: .列表页使用phantomjs模拟点击.每个链接只抓取第一页9-10条内容,按照标题去重 .布置定时任务,每 ...

  10. slim中的参数获取

    官方文档中对于get和post的参数有以下获取方式 $app->get('/', function (Request $req, Response $res, $args = []) { $my ...