23种设计模式 原型设计模式

news/2024/11/10 1:51:08

原型模式的定义:

  原型模式:使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。

原型模式的结构:

  原型模式主要包含3个角色:

    

    (1)Prototype(抽象原型类):声明克隆方法的接口,是所有具体原型类的公共父类,它可是抽象类也可以是接口,甚至可以是具体实现类。

    (2)ConcretePrototype(具体原型类):它实现抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。

    (3)Client(客户端):在客户类中,让一个原型对象克隆自身从而创建一个新的对象。

深克隆与浅克隆:

    浅克隆:当原型对象被复制时,只复制它本身和其中包含的值类型的成员变量,而引用类型的成员变量并没有复制。

    

    深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将被复制。

    


简要说明 深度克隆和浅克隆

 浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式被称为浅拷贝。

 深拷贝:当一个类的拷贝构造方法,不仅要复制对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实例值。



原型管理器(项目实战代码):

https://github.com/yzmaodeng/java-keypointknowledge/commit/4e35b9808bcc4e7207c6d1a6cd1e4295e4328ab5

  将多个原型对象存储在一个集合中供客户端使用,它是一个专门负责克隆对象的工厂,其中定义了一个集合用于存储原型对象,如果需要某个原型对象的一个克隆,可以通过复制集合中对应的原型对象来获得。

  

  



深度克隆的两种实现的方式


1、clone

https://blog.csdn.net/yz18931904/article/details/80576574

2、序列化

https://blog.csdn.net/yz18931904/article/details/80577589



最后陈词


优点

      1、如果创建新的对象比较复杂时,可以利用原型模式简化对象的创建过程,同时也能够提高效率。

      2、可以使用深克隆保持对象的状态。

      3、原型模式提供了简化的创建结构。

        4、扩展性好,由于原型模式提供了抽象原型类,在客户端针对抽象原型类进行编程,而将具体原型类写到配置文件中,增减或减少产品对原有系统都没有影响。

  5、:原型模式提供了简化的创建结构,工厂方法模式常常需要有一个与产品类等级结构相同的工厂等级结构,而原型模式不需要这样,圆形模式中产品的复制是通过封装在类中的克隆方法实现的,无需专门的工厂类来创建产品。




缺点

      1、在实现深克隆的时候可能需要比较复杂的代码。

      2、需要为每一个类配备一个克隆方法,而且这个克隆方法需要对类的功能进行通盘考虑,这对全新的类来说不是很难,但对已有的类进行改造时,不一定是件容易的事,必须修改其源代码,违背了“开闭原则”。


使用场景

     1、重复创建有相同的状态的对象的时候。

      2、状态变化很小,占内存不大,原型模式配合备忘录模式来足以。相反,采用状态模式会比原型模式更优。 







http://www.niftyadmin.cn/n/1930041.html

相关文章

23种设计模式 中介设计模式

https://github.com/yzmaodeng/java-keypointknowledge/commit/bf15dc2c7c49df34dbef0a550ace857dd38669aa中介者模式 定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独…

mysql显示缺半边_Mysql随笔

## 数据库操作 ##1.创建数据库和数据库中的表create database [if not exists]数据库名 [default character set 字符编码(集)]加上中括号是代表不是必选create database if not exists shcool defadult charset utf8;use 数据库名; //选中所需的数据库use school;…

myeclipse ssm mysql_基于jsp+mysql+Spring+mybatis的SSM客户关系管理系统

运行环境: 最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。IDE环境: Eclipse,Myeclipse,IDEA都可以tomcat环境: Tomcat 7.x,8.x,9.x版本均可,理论上Tomcat版本不是太老都可以。硬件环境: windows …

python定义不了类_在python类定义中找不到小部分

我的代码快完成了,但我还是搞不懂一件事。问题是:Write a class named Car that has the following data attributes:__year_model__make__speedThe Car class should have an __init__ method that accepted the cars year model and make as arguments…

linux centos7中使用service iptables stop 显示not loaded

centos从7开始默认用的是firewalld,这个是基于iptables的,虽然有iptables的核心,但是iptables的服务是没安装的。所以你只要停止firewalld服务即可: sudo systemctl stop firewalld.service && sudo systemctl disable fi…

python corr()用的是什么方法_用Python处理Args的3种方法

欢迎关注 “小白玩转Python”,发现更多 “有趣”1. sys 模块Python 中的 sys 模块具有 argv 功能。当通过终端触发 main.py 的执行时,此功能将返回提供给 main.py 的所有命令行参数的列表。除了其他参数之外,返回列表中的第一个元素是 main.p…

mac 项目部署

#!/bin/bash cd /workspace/GW/mybitauto-operation #替换环镜变量配置信息 src/main/resources/application.properties sed -i s/active.*/active: prod/g src/main/resources/application.properties# git pullmvn clean package/usr/bin/expect <<-EOF #参数设置 se…

mac mysql编码问题吗_Mac环境mysql5.7.21 utf8编码问题及解决方案

1. 目标&#xff1a;将 mysql 的 character_set_server 的值由 latin1 更改为 utf8暂时性&#xff1a;SET character_set_serverutf8 即可&#xff0c;一次性。永久性&#xff1a;需要更改配置文件&#xff0c;见第2步骤。2. mysql 5.7.21 的 support-files里没有配置文件。新建…