专栏首页静默虚空的博客[设计模式]原型模式

[设计模式]原型模式

简介

原型模式 (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 条评论
登录 后参与评论

相关文章

  • JAVA 设计模式 迭代器模式

    用途 迭代器模式 (Iterator) 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 迭代器模式是一种行为型模式。 结构 ? ...

    静默虚空
  • Spring Boot 之使用 Json 详解

    Spring Boot 提供了 Jackson 的自动配置,Jackson 是 spring-boot-starter-json 的一部分。当 Jackson ...

    静默虚空
  • JAVA 设计模式 外观模式

    用途 外观模式 (Facade) 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 外观模式是一种结构型...

    静默虚空
  • 学习前端 第4周 第1天

    Joel
  • 软件测试用例常用七大方法

    小老鼠
  • 世纪之战:Python和Java,到底学哪个更好?

    尽管在刚开始开发AI时,有很多编程语言都可以满足你的需求,但没有一种编程语言是可以一站式解决AI编程的问题,因为在每一个项目中,不同的目标需要特定的方法。

    Java技术栈
  • Leetcode 17 Letter Combinations of a Phone Number

    Given a digit string, return all possible letter combinations that the number c...

    triplebee
  • kubernetes系列教程(十六)基于nginx ingress实现服务暴露

    本章介绍kubernetes系列教程的ingress概念,在kubernetes中对外暴露服务的方式有两种:service(NodePort或者外部LoadBa...

    HappyLau谈云计算
  • string util 笔记

    这个主要为了收集对于string 字符串的一些操作,如果有更好的会进行替换。欢迎补充评论点赞。

    solate
  • AI 的舅老爷香农,是如何影响了今天的深度学习?

    场景描述:今天写的这位长者,也是位不得了的人物——香农,学界尊称他为「信息科学之父」。香农的信息论里的一些贡献,也实际影响了AI 的发展,在深度学习大行其道的今...

    HyperAI超神经

扫码关注云+社区

领取腾讯云代金券