[设计模式]原型模式

简介

原型模式 (Prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

原型模式是一种对象创建型模式可参考 设计模式 创建型模式)。

结构

图-原型模式结构图

Prototype:声明一个克隆自身的接口。 ConcretePrototype:实现克隆自身的具体操作。 Client:调用 Prototype 来克隆自身,从而创建一个新对象。

动机

当要实例化的类是在运行时刻指定时,例如,通过动态装载。 为了避免创建一个与产品类层次平行的工厂类层次时。 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。 

浅拷贝与深拷贝

浅拷贝是指当对象的字段值被复制时,字段引用的对象不会被复制。 例如:如果一个对象有一个指向字符串的字段,并且我们对该对象做了一个浅拷贝,那麽两个对象将引用同一个字符串。 深拷贝是指当一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝。

实例

原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件:

  1. 实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。
  2. 重写Object类中的clone方法。Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,Prototype类需要将clone方法的作用域修改为public类型。

原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。在实际应用中,原型模式很少单独出现。经常与其他模式混用,他的原型类Prototype也常用抽象类来替代。 

代码

class Prototype implements Cloneable {
 public Prototype clone() {
         Prototype prototype = null;
 try {
             prototype = (Prototype)super.clone();
         } catch (CloneNotSupportedException e) {
             e.printStackTrace();
         }
 return prototype;
     }
 }
 
 class ConcretePrototype extends Prototype {
 public void show() {
         System.out.println("原型模式实现类");
     }
 }
 
 public class PrototypePattern {
 public static void main(String[] args) {
         ConcretePrototype cp = new ConcretePrototype();
 for(int i=0; i< 10; i++){  
             ConcretePrototype clonecp = (ConcretePrototype)cp.clone();  
             clonecp.show();  
         }  
     }
 }

推荐阅读

本文属于 设计模式系列

参考资料

《大话设计模式》 《HeadFirst设计模式》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码云1024

对象的序列化与反序列化

34815
来自专栏专注 Java 基础分享

Java 对象序列化和反序列化

     之前的文章中我们介绍过有关字节流字符流的使用,当时我们对于将一个对象输出到流中的操作,使用DataOutputStream流将该对象中的每个属性值逐个...

1836
来自专栏IT可乐

Java关键字(四)——final

  对于Java中的 final 关键字,我们首先可以从字面意思上去理解,百度翻译显示如下:

693
来自专栏IT可乐

Java的深拷贝和浅拷贝

  关于Java的深拷贝和浅拷贝,简单来说就是创建一个和已知对象一模一样的对象。可能日常编码过程中用的不多,但是这是一个面试经常会问的问题,而且了解深拷贝和浅拷...

2796
来自专栏FSociety

Oracle中字符串大小比较以及数据隐式转化

首先我们得明白在数据库中单引号是用来字符串引用的,不管是数字还是时间,当你用单引号引用起来之后,数据库就会将他当成字符串来对待。

912
来自专栏Jimoer

JVM学习记录-类加载的过程

类的整个生命周期的7个阶段是:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(I...

572
来自专栏Astropeak

Spring使用 --- 基本概念(一):DI,依赖注入

952
来自专栏coding for love

JS入门难点解析6-作用域链

(注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!) (注2:更多内容请查看我的目录。)

631
来自专栏烂笔头

Python标准库笔记(9) — functools模块

1543
来自专栏陈树义

从 HelloWorld 看 Java 字节码文件结构

很多时候,我们都是从代码层面去学习如何编程,却很少去看看一个个 Java 代码背后到底是什么。今天就让我们从一个最简单的 Hello World 开始看一看 J...

3796

扫码关注云+社区