[设计模式]原型模式

简介

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

相关文章

来自专栏blackheart的专栏

[C#1] 12-特性

1.特性简介 特性仅仅是为目标元素提供关联的附加信息的一种方式,编译器的工作只是将这些附加信息放到托管模块的元数据中, 大多特性对于编译器来说没有任何特殊的意义...

1968
来自专栏ASP.NETCore

动手实现扩展属性为对象动态添加获取数据(续)

在上一篇文章中我们了解了扩展属性的原理和结构,其实其内部结构与思想都与WPF中的依赖属性基本相同,大家也可以从中了解到关于依赖属性的原理,这对了解及使用依赖属性...

721
来自专栏nummy

ECMAScript 6 特性ECMAScript 6 特性

ECMAScript 6,也被称做ECMAScript 2015,是ECMAScript标准的下一个版本。这个标准预计将于2015年6月被正式批准。ES6是这门...

621
来自专栏菩提树下的杨过

.NET3.5新特性,Lambda表达式

【原文地址】New “Orcas” Language Feature: Lambda Expressions 【原文发表日期】 Sunday, April 0...

1838
来自专栏进击的君君的前端之路

设计模式

1122
来自专栏IT进修之路

原 分分钟看懂java用引用传递与值传递在

1714
来自专栏博客园

Core官方DI解析(3)-ServiceCallSite

上一篇说过在整个DI框架中IServiceProviderEngine是核心,但是如果直接看IServiceProviderEngine派生类其实看不出也没什么...

492
来自专栏me的随笔

foreach 引发的值类型与引用类型思考

用都知道的一句话概括:“引用类型在堆上,栈上只保存引用;值类型即可存放于栈上也可存放于堆上,值类型变量直接存储值本身”。

824
来自专栏青枫的专栏

java基础学习_JDK新特性_day28总结

511
来自专栏熊二哥

快速入门系列--深入理解C#

C#语言在近些年得到了长足的方法,代码风格越来越简洁美观,例如常用的泛型及其约束、可空类型、隐式类型、匿名类型和委托等,通过下面的表格可以对这部分相对简单的特性...

1875

扫码关注云+社区