首页 > 编程语言 >Java设计模式5 - 原型模式

Java设计模式5 - 原型模式

时间:2024-09-27 14:52:47浏览次数:9  
标签:Java 角色 对象 clone 模式 原型 设计模式 public

原型模式

原型模式属于对象的创建模式,通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原型模式的用意。

 

原型模式结构

原型模式要求对象实现一个可以克隆机身的接口,这样就可以通过复制一个实例对象本身来创建一个新的实例。这样一来,通过原型实例创建新的对象,就不再需要关心这个实例本身的类型,只要实现了克隆自身的方法,就可以通过这个方法来获取新的对象,而无须再通过new去创建。

原型模式涉及到三个角色:

1、客户角色

客户类提出创建对象的请求

2、抽象原型角色

这是一个抽象角色,通常由一个接口或者抽象类实现,此角色给出所有具体原型类所需的接口

3、具体原型角色

被复制的角色,此角色需要实现抽象的原型角色所要求的接口

 

原型模式示例

定义一个抽象原型角色,抽象类,实现Cloneable接口:

public abstract class Prototype implements Cloneable
{
    public Prototype clone()
    {
        Prototype prototype = null;
        try
        {
            prototype = (Prototype)super.clone();
        }
        catch (CloneNotSupportedException e)
        {
            e.printStackTrace();
        }
        
        return prototype;
    }
    
    public abstract void show();
}

定义一个具体原型角色,继承Prototype类:

public class ConcretePrototype extends Prototype
{
    public void show()
    {
        System.out.println("ConcretePrototype.show()");
    }
}

定义一个客户端调用:

public class Client
{
    public static void main(String[] args)
    {
        ConcretePrototype cp = new ConcretePrototype();
        for (int i = 0; i < 10; i++)
        {
            ConcretePrototype clonecp = (ConcretePrototype)cp.clone();
            clonecp.show();
        }
    }
}

比方说一个类实例很有用的时候,就可以使用原型模式去复制它。不过原型模式单独用得不多,一般是和其他设计模式一起使用。

 

原型模式在Java中的应用及解读

既然原型模式的关注点是在于通过克隆自身来获取一个和自身一样的对象,那其实只要是实现了Cloneable接口的类都可以算是原型模式的应用,比如ArrayList吧:

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    ...
    public Object clone() {
    try {
        ArrayList<E> v = (ArrayList<E>) super.clone();
        v.elementData = Arrays.copyOf(elementData, size);
        v.modCount = 0;
        return v;
    } catch (CloneNotSupportedException e) {
        // this shouldn't happen, since we are Cloneable
        throw new InternalError();
    }
    }
    ...
}

程序中获取到了一个ArrayList的实例arrayList,我们完全可以通过调用arrayList.clone()方法获取到原ArrayList的拷贝。

 

原型模式的优点

原型模式是一种类的创建模式,可以看到到目前为止的四种创建型模式,客户端(调用方)都没有直接new一个类实例出来。把new一个类实例的动作由客户端(调用方)交给别人做而不是自己做,这就是创建型模式的宗旨。

使用原型模式创建对象比直接new一个对象在性能上好得多,因为Object类的clone()方法是一个native方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。

使用原型模式的另一个好处是简化对象的创建,使得创建对象就像普通的复制黏贴一样简单。

标签:Java,角色,对象,clone,模式,原型,设计模式,public
From: https://blog.51cto.com/u_16528511/12129081

相关文章

  • java的基础入门学习03——抽象类与抽象方法的使用
    文章目录前言1、抽象类1.1什么是抽象类1.2如何使用抽象类2、抽象方法2.1什么是抽象方法2.2抽象方法的使用3、运用实例前言首先在学习抽象类以及抽象方法之前,我们得先了解什么是抽象,抽象其实也被成为面向对象的第四大特征,abstract就是java中对应的关键字,抽象往......
  • java的基础入门学习02-面向对象特性及使用
    文章目录前言面向对象1、什么是面向对象2、面向对象的三大特性2.1封装特性2.2继承特性2.3多态特性前言java中经常会把需要使用到的数据结构来封装成对象,而当我们这些后来希望使用前辈留下来的代码或者自己拓展功能供大家借鉴使用,面向对象是学习java中十分重要的......
  • 给Java同仁单点的AI"开胃菜"--搭建一个自己的本地问答系统
    这是我参与创作者计划的第1篇文章大家好,因为对AI大模型很感兴趣,相信很多兄弟们跟我一样,所以最近花时间了解了一些,有一些总结分享给大家,希望对各位有所帮助;本文主要是目标是讲解如何在本地搭建一个简易的AI问答系统,主要用java来实现,也有一些简单的python知识;网上很多例子都......
  • 【Java】【SpringBoot】SpringBoot整合MybatisPlus(快速入门)
    较早之前,写了SpringBoot整合Mybatis:https://www.cnblogs.com/luyj00436/p/16701894.html。这个数据库的链接有过时。Mybatisplus是mybatis的增强工具。对比Mybatis功能强大、易于使用。对于复杂业务,需要连接多张表单,Mybatisplus不够灵活,隐藏了代码,也不能更好地调试;对于简单业务......
  • 基于Java的学生档案管理系统
    基于springboot+vue实现的学生档案管理系统 (源码+L文+ppt)4-065  第4章系统设计   4.1总体功能设计学生档案管理系统的总体功能设计包括学生信息管理、课程管理、教师信息管理、成绩管理和系统配置管理。系统将提供用户友好的界面,支持学生信息的录入、查询和......
  • 【Java】【Idea】MyBatisPlusX 的使用
    1.安装MybatisPlusX插件 2.连接数据库 3.右击,选择“MybatisX-Generator”。 4.生成设置。  ......
  • 基于Java的学生档案管理系统
     基于springboot+vue实现的学生档案管理系统 (源码+L文+ppt)4-065  第4章系统设计   4.1总体功能设计学生档案管理系统的总体功能设计包括学生信息管理、课程管理、教师信息管理、成绩管理和系统配置管理。系统将提供用户友好的界面,支持学生信息的录入、查询......
  • 基于Java的学生档案管理系统
     基于springboot+vue实现的学生档案管理系统 (源码+L文+ppt)4-065  第4章系统设计   4.1总体功能设计学生档案管理系统的总体功能设计包括学生信息管理、课程管理、教师信息管理、成绩管理和系统配置管理。系统将提供用户友好的界面,支持学生信息的录入、查询......
  • 基于Java的学生档案管理系统
     基于springboot+vue实现的学生档案管理系统 (源码+L文+ppt)4-065  第4章系统设计   4.1总体功能设计学生档案管理系统的总体功能设计包括学生信息管理、课程管理、教师信息管理、成绩管理和系统配置管理。系统将提供用户友好的界面,支持学生信息的录入、查询......
  • MySQL 8.0 为 Java 开发者提供了许多强大的新特性
    以下是一些关键点:1.通用表表达式(CTE):CTE允许您定义命名的临时结果集,这些结果集可以在后续的SELECT、INSERT、UPDATE、DELETE或CREATEVIEW语句中被引用。这对于编写复杂查询特别有用。WITHRECURSIVEemployee_hierarchyAS(SELECTid,name,manager_id,1ASlevelF......