原型模式是创建型模式。

设计意图:用原型实例指定创建对象的类型,并通过拷贝这个原型来创建新的对象。

我们使用构建简历的样例的类图来说明原型模式。

类图:

原型模式主要用于对象的复制。它的核心是就是类图中的原型类Prototype。这里我们定义了一个抽象的原型接口,声明了用于clone自己的方法,这里我们已创建简历为详细原型类,Prototype类须要具备下面两个条件:

  • 实现Cloneable接口。在java语言有一个Cloneable接口,它的作用仅仅有一个。就是在执行时通知虚拟机能够安全地在实现了此接口的类上使用clone方法。

    在java虚拟机中,仅仅有实现了这个接口的类才干够被拷贝,否则在执行时会抛出CloneNotSupportedException异常。

  • 重写Object类中的clone方法。

    Java中,全部类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,可是其作用域protected类型的。一般的类无法调用,因此。Prototype类须要将clone方法的作用域改动为public类型。

原型模式是一种比較简单的模式,也非常easy理解,实现一个接口,重写一个方法即完毕了原型模式。在实际应用中,原型模式非常少单独出现。经常与其它模式混用,他的原型类Prototype也经常使用抽象类来替代,这里我们在原型类上加了一个接口。该接口类继承的Cloneable接口,这样我们能够在我们自己接口中更灵活的控制详细原型类的逻辑是什么。

package com.prototype;

/**
* @author gaoxu
* 实践出真知!
*/
public interface IPrototype extends Cloneable{ public Prototype clone();
public void show(); }
package com.prototype;

/**原型抽象类。採用原型抽象类。能够使详细原型类有很多其它的可复用的属性实现
* @author gaoxu
* 实践出真知。
*/
public abstract class Prototype implements IPrototype{
String name = "";
String mobile = "";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
@Override
public Prototype clone() {
Prototype prototype = null;
try {
prototype = (Prototype) super.clone();
} catch (CloneNotSupportedException e) { e.printStackTrace();
}
return prototype;
} public String toString(){
return "mobile="+mobile+",name="+name;
}
}
package com.prototype;

/**
* 简历原型实现类
*
* @author gaoxu 实践出真知。
*/
public class Resume extends Prototype { @Override
public void show() { System.out.println(""+toString());
} }
package com.prototype;

/**
* @author gaoxu
* 实践出真知! */
public class Client { /**
* @param args
*/
public static void main(String[] args) { Resume resume = new Resume();
resume.setName("高旭");
resume.setMobile("1390000111"); Resume resume1 = (Resume) resume.clone();
Resume resume2 = (Resume) resume.clone(); System.out.println(resume.toString());
System.out.println(resume1.toString());
System.out.println(resume2.toString()); } }

原型模式的长处和适用场景:

最大的长处就是创建对象性能好。比new要快不少,由于Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的区别很明显。所以须要反复创建对象的场景基本都能够适用。

原型模式的注意事项

  • 使用原型模式复制对象不会调用类的构造方法。由于对象的复制是通过调用Object类的clone方法来完毕的,它直接在内存中复制数据。不用又一次初始化,直接获得对象执行时的状态。

    不但构造方法中的代码不会执行,甚至连訪问权限都对原型模式无效。

    单例模式中,仅仅要将构造方法的訪问权限设置为private型。就能够实现单例。可是clone方法直接无视构造方法的权限。所以,单例模式与原型模式是冲突的,所以不能把单例模式的类对象进行拷贝,那样就不是单例了。

跟着实例学习设计模式(7)-原型模式prototype(创建型)的更多相关文章

  1. 原型模式 prototype 创建型 设计模式(七)

    原型模式  prototype 意图 用原型实例指定需要创建的对象的类型,然后使用复制这个原型对象的方法创建出更多同类型的对象   显然,原型模式就是给出一个对象,然后克隆一个或者更多个对象 小时候看 ...

  2. Java设计模式05:常用设计模式之原型模式(创建型模式)

    1. Java之原型模式(Prototype Pattern)     原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. ...

  3. 设计模式05: Prototype 原型模式(创建型模式)

    Prototype 原型模式(创建型模式) 依赖关系的倒置抽象不应该依赖于实现细节,细节应该依赖于抽象.对所有的设计模式都是这样的. -抽象A直接依赖于实现细节b -抽象A依赖于抽象B,实现细节b依赖 ...

  4. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...

  5. 二十四种设计模式:原型模式(Prototype Pattern)

    原型模式(Prototype Pattern) 介绍用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象.示例有一个Message实体类,现在要克隆它. MessageModel usin ...

  6. 创建型设计模式之原型模式(Prototype)

    结构   意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 适用性 当要实例化的类是在运行时刻指定时,例如,通过动态装载:或者 为了避免创建一个与产品类层次平行的工厂类层次时:或 ...

  7. 设计模式 笔记 原型模式 prototype

    //---------------------------15/04/07---------------------------- //prototype 原型模式--对象创建型模式 /* 1:意图: ...

  8. [设计模式] 4 原型模式 prototype

    设计模式:可复用面向对象软件的基础>(DP)本文介绍原型模式和模板方法模式的实现.首先介绍原型模式,然后引出模板方法模式. DP书上的定义为:用原型实例指定创建对象的种类,并且通过拷贝这些原型创 ...

  9. python 设计模式之原型模式 Prototype Pattern

    #引入 例子1: 孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来. 例子2:寄个快递下面是一个邮寄快递的场景:“给我寄个快递.”顾客说.“寄往什么地方?寄给……?”你问.“和上次差不多一样,只是邮 ...

  10. 【UE4 设计模式】原型模式 Prototype Pattern

    概述 描述 使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.如孙悟空猴毛分身.鸣人影之分身.剑光分化.无限剑制 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象, ...

随机推荐

  1. 《linux设备驱动开发详解》笔记——11内存与IO访问

    内存访问与映射是linux驱动常见操作,操作硬件时离不开内存的映射,本章比较重要. 11.1 CPU与内存.I/O 目前的嵌入式处理器,都不提供专门的I/O空间,而仅存在内存空间:各种外设寄存器都直接 ...

  2. python爬虫基础03-requests库

    优雅到骨子里的Requests 本文地址:https://www.jianshu.com/p/678489e022c8 简介 上一篇文章介绍了Python的网络请求库urllib和urllib3的使用 ...

  3. PAT Basic 1029

    1029 旧键盘 旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在2行中分别给出应该输 ...

  4. spring-cloud-sleuth 学习资源

    https://www.baeldung.com/spring-cloud-sleuth-single-application https://howtodoinjava.com/spring-clo ...

  5. 【14】PNG,GIF,JPG的区别及如何选

    [14]PNG,GIF,JPG的区别及如何选 GIF: 8位像素,256色 无损压缩 支持简单动画 支持boolean透明 适合简单动画 JPEG: 颜色限于256 有损压缩 可控制压缩质量 不支持透 ...

  6. poj2217 Secretary 后缀数组

    #include <iostream> #include <cstring> #include <string> #include <cstdio> u ...

  7. RAISERROR 的用法(转)

    raiserror 的作用: raiserror 是用于抛出一个错误.[ 以下资料来源于sql server 2005的帮助 ]   其语法如下: RAISERROR ( { msg_id | msg ...

  8. DIV垂直/水平居中2(DIV宽度和高度是动态的)

    <!doctype html><html><head><meta charset="utf-8"><title>块元素D ...

  9. [luoguP2862] [USACO06JAN]把牛Corral the Cows(二分 + 乱搞)

    传送门 可以二分边长 然后另开两个数组,把x从小到大排序,把y从小到大排序 枚举x,可以得到正方形的长 枚举y,看看从这个y开始,往上能够到达多少个点,可以用类似队列来搞 其实发现算法的本质之后,x可 ...

  10. 洛谷P3760 - [TJOI2017]异或和

    Portal Description 给出一个\(n(n\leq10^5)\)的序列\(\{a_n\}(\Sigma a_i\leq10^6)\),求该数列所有连续和的异或和. Solution 线段 ...