设计模式之原型模式

前言

一直以来对设计模式都有着莫名的喜欢,总觉得这是前辈们留下的无穷宝藏,今天,我带大家一起挖挖宝!

大家一起参与到讨论中来偶!


什么是原型模式?

        说到原型模式,额,其实我也没用过,也没什么发言权,哈哈,但是,今天写了一个小的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);
    }
}

最终结果如下:
首先是原型模式的:
测试结果一
接下来是,普通的:
测试结果二
        结果出来了,很明显,原型模式没有悬念的赢了!我的小心脏终于放下来了!
        当然,我们可以预想如果一个对象很大,那么这样的性能提高,也是不错的呢!

总结

        今天主要看了原型模式的应用,真的受益匪浅,希望能对常见的设计模式都能有一个不错的认识!谢谢大家!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值