前言
一直以来对设计模式都有着莫名的喜欢,总觉得这是前辈们留下的无穷宝藏,今天,我带大家一起挖挖宝!
大家一起参与到讨论中来偶!
什么是原型模式?
说到原型模式,额,其实我也没用过,也没什么发言权,哈哈,但是,今天写了一个小的demo,来说明它的好处。
首先,我们来看看它的定义和场景呗!
定义 | 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 |
类型 | 创建类模式 |
原型模式的优点及适用场景 | 在需要重复地创建相似对象时可以考虑使用原型模式。比如需要在一个循环体内创建对 象,假如对象创建过程比较复杂或者循环次数很多的话,使用原型模式不但可以简化创建过程,而且可以使系统 的整体性能提高很多。 |
看完了上面的场景,大家一定对原型模式有了一个基本的认识吧!但是,上面反复提到的一个东西是:提高效率,到底怎么个提高法呢?那我们今天就秉承着公正的态度,让原型模式和普通的对象构建方法来一场竞赛吧!
在这之前,让我们先来看一下怎么实现原型模式吧!
1:实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷
贝,否则在运行时会抛出CloneNotSupportedException异常。
2:重写Object类中的clone方法。Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,Prototype类需要将clone方法的作用域修改为public类型。
竞赛开始
首先,确定竞赛规则:每方代表队新建1000个对象,并执行相应的方法?好了,废话不多说,开始!
首先贴出比赛道具:
package com.weimob.test;
/**
* 原型类,看到了莫有,实现了clone()方法偶
*
* @author fulei.yang
*
*/
public class Prototype implements Cloneable {
@Override
public Prototype clone() {
Prototype prototype = null;
try {
prototype = (Prototype) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return prototype;
}
}
package com.weimob.test;
/**
* 原型类的继承 ,这里的话要注意get/set方法我省略了
*
* @author fulei.yang
*
*/
public class MyPrototype extends Prototype {
private String name;
private String pass;
private String sex;
private String hello;
private String girl;
public MyPrototype(String name, String pass, String sex, String hello, String girl) {
super();
this.name = name;
this.pass = pass;
this.sex = sex;
this.hello = hello;
this.girl = girl;
}
public void show() {
System.out.println("测试进行中!");
}
}
下面就要开始比赛了,我的小心脏砰砰的跳,要是原型模式输了,我不是自己打脸了!好吧,只有一赌,大家下注!嘿嘿
package com.weimob.test;
public class T {
public static void main(String[] args) {
long start = System.currentTimeMillis();
MyPrototype my = new MyPrototype("1","1","1","1","1");
// for (int i = 0; i < 1000; i++) {
// MyPrototype myclone = (MyPrototype) my.clone();
// myclone.show();
// }
for (int i = 0; i < 1000; i++) {
MyPrototype mynotclone = new MyPrototype("1","1","1","1","1");
mynotclone.show();
}
long end = System.currentTimeMillis();
long result = (end - start);
System.out.println(result);
}
}
最终结果如下:
首先是原型模式的:
接下来是,普通的:
结果出来了,很明显,原型模式没有悬念的赢了!我的小心脏终于放下来了!
当然,我们可以预想如果一个对象很大,那么这样的性能提高,也是不错的呢!
总结
今天主要看了原型模式的应用,真的受益匪浅,希望能对常见的设计模式都能有一个不错的认识!谢谢大家!