Java设计模式之原型设计示例详解

作者:Thinkao~ 时间:2023-08-04 04:53:35 

简单说一下(定义)

什么是原型模式:原型模式是用于创建重复的对象,同时又能保证性能。用一个已经创建的实例作为原型,通过复制该原型对象来创建一个或者多个和原型相同或者相似的新对象

举例说明:我们都玩过 * 的游戏,敌军的飞机可谓是数不胜数,但是如果每出一架敌机都要重新实例化的话,那么自然我们的功能很复杂。所以这个时候我们的原型模式就派上用场了,只实例化一架飞机出来,其他的照着他复制就可以啦

稍微夸一下(优缺点)

原型模式优点:

1.当创建新的对象实例比较复杂时,使用原型模式通过一个已有实例可以提高新实例创建效率
2.可以动态增加或者减少产品类
3.原型模式提供了简单的创建结构
4.可以使用深克隆的方式保存对象的状态

原型模式缺点:
1.对已有类进行改造时,必须修改其源码,违背了开闭原则
2.在实现深克隆时需要编写较为复杂的代码

顺便提一下(适用场景)

原型模式的适用场景:
1.对象种类繁多,无法将他们整合到一个类的时候
2.难以根据类生成实例时
3.想解耦框架与生成的实例时

着重讲一下(深、浅克隆)

在原型模式中有两个概念需要讲下,就是深克隆与浅克隆。顾名思义浅克隆只是复制了基础属性(如八大基本类型),然而引用类型实际上没有复制,只是将对应的引用给复制了(复制地址)。
 

浅克隆:如果原型对象的成员变量是值类型(如八大基本类型),那么就是直接复制;如果是复杂的类型,就只是复制对应的内存地址。(网上当个图)
换言之,就是复杂类型的成员变量(String,枚举等)用的是一个,修改了克隆对象的原型对象也会,他们是共用的(类似于响应式)。而值类型不是共用的。

Java设计模式之原型设计示例详解

深克隆:深克隆就是什么都是单独的,全部复制,复制之后的全部各自独立。修改克隆对象对于原型对象没有任何影响(浅克隆中修改克隆对象,原型对象跟着变)。

Java设计模式之原型设计示例详解

多多用一下(结构、代码实现)

模式结构

原型模式主要包含三个部分:具体原型类、抽象原型类、访问类
具体原型类:实现抽象原型类的clone()方法,是可被复制的对象
抽象原型类:规定了具体原型对象必须实现的接口
访问类:使用具体原型类中的clone()方法类复制新的对象
一图走天下:

Java设计模式之原型设计示例详解

代码实现

1.创建具体原型类RealizeType.java

public class RealizeType implements Cloneable {
   RealizeType(){
       System.out.println("原型创建成功");
   }
   public Object clone() throws CloneNotSupportedException {
       System.out.println("具体原型复制成功");
       return super.clone();
   }
}

2.原型模式测试类PrototypeTest.java

public class PrototypeTest {
   public static void main(String[] args) throws CloneNotSupportedException {
       RealizeType obj = new RealizeType();
       RealizeType obj1 = (RealizeType) obj.clone();
       System.out.println("obj==obj1?"+(obj==obj1));
   }
}

3.运行结果

原型创建成功
具体原型复制成功
obj==obj1?false

来源:https://blog.csdn.net/wangxinyao1997/article/details/94435127

标签:Java,原型,设计模式
0
投稿

猜你喜欢

  • 详解Java中的时区类TimeZone的用法

    2023-11-29 02:03:09
  • JAVA内存溢出解决方案图解

    2023-07-22 14:57:23
  • SpringBoot集成Elasticsearch过程实例

    2022-07-30 20:08:56
  • 基于Matlab实现中国象棋的示例代码

    2022-09-06 23:47:54
  • Gradle进阶使用结合Sonarqube进行代码审查的方法

    2021-12-17 08:49:56
  • Android自定义view仿淘宝快递物流信息时间轴

    2022-02-20 18:51:16
  • 从Cocos2d-x2迁移到Cocos2d-x3的过程分享

    2021-06-07 23:52:28
  • Android仿微信图片上传带加号且超过最大数隐藏功能

    2022-12-27 13:20:03
  • Java时间工具类Date的常用处理方法

    2022-11-08 02:37:49
  • java设计模式之浅谈适配器模式

    2023-11-19 14:46:26
  • 基于集合的子集与集合的全排列的相关问题

    2023-09-23 07:03:46
  • Android实战教程第八篇之短信备份

    2021-07-17 23:31:43
  • SpringBoot 项目中创建线程池

    2023-09-21 22:12:04
  • Java多线程状态及方法实例解析

    2021-09-10 22:49:53
  • C#动态生成DropDownList执行失败原因分析

    2023-08-30 22:37:28
  • SpringBoot数据层测试事务回滚的实现流程

    2022-05-01 14:36:37
  • java实现简单年龄计算器

    2022-01-28 02:23:34
  • 图文并茂讲解RocketMQ消息类别

    2023-06-11 07:59:41
  • Java中抽象类与方法的重写方式

    2023-08-25 09:20:29
  • hibernate-validator改进校验框架validator v0.4使用

    2023-01-22 21:08:07
  • asp之家 软件编程 m.aspxhome.com