文档章节

设计模式-原型模式

song316
 song316
发布于 2016/08/13 11:28
字数 349
阅读 7
收藏 0

原型模式介绍

原型模式一般很少单独使用,一般和工厂方法模式一起组合使用.

类图

原型模式

优点

  1. 性能好.使用native方法直接在堆内存中拷贝,性能比new好很多.
  2. 规避构造函数的约束.直接拷贝内存,不会执行构造函数.

使用场景

  1. 比如需要在循环体内产生大量对象.
  2. 规避构造函数的约束.

场景举例

  • 信用卡账单邮件模板.

    根据模板生成一个对象, 每封邮件都是次对象的clone.

注意

  • 除基本类型外的其他类型(比如ArrayList,自定义对象等),都不会做拷贝.Clone对象和原对象的成员变量的引用相同.
  • final修饰的成员变量无法实现深拷贝.

浅拷贝和深拷贝

  • 只有java的基本类型才会拷贝,其他类型拷贝需要特殊处理,处理方式见下方代码.

基本拷贝

public class Test {
    public static void main(String[] args) {
        ConcretePrototype cp = new ConcretePrototype();
        for (int i = 0; i < 5; i++) {
            ConcretePrototype clone = (ConcretePrototype) cp.clone();
            clone.show();
        }
    }
}

class Prototype implements Cloneable {
    @Override
    public Prototype clone() {
        try {
            return (Prototype) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
}

class ConcretePrototype extends Prototype {
    public void show() {
        System.out.println("原型模式实现!");
    }
}

深拷贝

class Thing implements Cloneable{
    private ArrayList<String> list = new ArrayList<>();
    @Override
    public Thing clone(){
        try {
            Thing thing = (Thing)super.clone();
            thing.list = (ArrayList<String>)this.list.clone();
            return thing;
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
}

© 著作权归作者所有

共有 人打赏支持
下一篇: Http客户端
song316
粉丝 1
博文 9
码字总数 1085
作品 0
闵行
高级程序员
私信 提问

暂无文章

c++ 定义新的异常

#include <iostream> #include <exception> using namespace std; struct MyException : public exception { const char * what () const throw () { return "C++ Exception"; } }; int main......

天王盖地虎626
33分钟前
1
0
PDMan-2.1.1 发布:用心开源,免费的国产数据库建模工具(春节前最后一个版本)

一、软件介绍 PDMan 是一款开源免费的数据库模型建模工具,是PowerDesigner之外另一种更好的选择。支持Windows,Mac,Linux等操作系统,具有上手容易,使用简单的特点。 2018年获得码云GVP (Gi...

O龙猫O
58分钟前
10
0
OSChina 周二乱弹 —— 以后我偷小鱼干养你

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @庞巴哥 :只有这节奏瞬间变得轻松。。。。。。。。。分享Talking Eyes的单曲《In the sun (Extended Version)》: 《In the sun (Extended Ve...

小小编辑
今天
104
6
多表查询

第1章 多表关系实战 1.1 实战1:省和市  方案1:多张表,一对多  方案2:一张表,自关联一对多 1.2 实战2:用户和角色 (比如演员和扮演人物)  多对多关系 1.3 实战3:角色和权限 (比如...

stars永恒
今天
9
0
求推广,德邦快递坑人!!!!

完全没想好怎么来吐槽自己这次苦逼的德邦物流过程了,只好来记一个流水账。 从寄快递开始: 2019年1月15日从 德邦物流 微信小app上下单,截图如下: 可笑的是什么,我预约的是17号上门收件,...

o0无忧亦无怖
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部