原型模式是创建型模式。

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

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

类图:

原型模式主要用于对象的复制。它的核心是就是类图中的原型类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】【git】git报错fatal: HTTP request failed

    在使用git pull.git push.git clone会报类似如下的错误: error: The requested URL returned error: 401 Unauthorized w ...

  2. day20-python之装饰器

    1.装饰器 #!/usr/bin/env python # -*- coding:utf-8 -*- import time def cal(l): start_time=time.time() re ...

  3. logistic回归原理和公式

    转自:http://blog.csdn.net/ariessurfer/article/details/41310525 Logistic回归为概率型非线性回归模型,是研究二分类观察结果与一些影响因素 ...

  4. Educational Codeforces Round 32:E. Maximum Subsequence(Meet-in-the-middle)

    题目链接:E. Maximum Subsequence 用了一个Meet-in-the-middle的技巧,还是第一次用到这个技巧,其实这个技巧和二分很像,主要是在dfs中,如果数量减小一半可以节约很 ...

  5. Java中TreeMap集合讲解

    1.TreeSet介绍 TreeSet是一个有序集合,可以以任意顺序将元素插入到集合中,在对集合进行遍历的时候,每个元素将自动按照排序后的顺序呈现.底层使用的是二叉树(更具体点是红黑树)实现,对于元素 ...

  6. django的rest framework框架——分页、视图、路由、渲染器

    一.rest framework的分页 1.使用rest framework内置类PageNumberPagination实现分类 from django.conf.urls import url f ...

  7. JAVA连接MYSQL8.0问题

    title: java连接mysql8.0问题 date: 2018-07-08 19:27:38 updated: tags: description: keywords: comments: im ...

  8. java 枚举类型的使用

    应用  http://blog.csdn.net/qq_27093465/article/details/52180865 原理 http://blog.csdn.net/javazejian/art ...

  9. Repeat Array Generator & String.repeat

    Repeat Array Generator RepeatArrayGenerator "use strict"; /** * * @author xgqfrms * @licen ...

  10. BZOJ 2820 YY的GCD ——莫比乌斯反演

    我们可以枚举每一个质数,那么答案就是 $\sum_{p}\sum_{d<=n}\mu(d)*\lfloor n / pd \rfloor *\lfloor m / pd \rfloor$ 直接做 ...