[设计模式]-原型模式

  1. 什么是原型模式
    通过复制一个已存在对象来生成一个新对象,被复制的对象称为原型;
  2. 补充说明
    1、JAVA中Object的clone方法已经为什么提供了复制对象的实现,且该方法为本地方法,性能好,在需要大量复制对象的情况,使用clone创建对象比new效率高;
    补充下深拷贝和浅拷贝,深拷贝是通过拷贝内存(包括引用的对象)实现对象的创建;浅拷贝不拷贝引用的对象,但拷贝了引用的值,如果类的成员属性中都是基本类型,不含对象,也是可以达到深拷贝的效果;深拷贝可以通过将对象序列化成字节流以及反序列化实现,浅拷贝直接调用clone即可;
    2、使用原型模式创建对象是没有调用类的构造方法的;
  3. 角色
    原型角色(ps,也可以搞成两个,如抽象原型角色以及各个具体实现原型角色)
    四、JAVA实现例子
    java已经很好的支持原型模式了,使用很简便,如下类,实现了Cloneable接口,即成了一个原型;
package com.pichen.dp.creationalpattern.prototype;

public class Cell implements Cloneable{
    private int cellId;
    public int getCellId() {
        return cellId;
    }
    public void setCellId(int cellId) {
        this.cellId = cellId;
    }
    public Cell(int id) {
        this.cellId = id;
    }
    @Override
    public Object clone() throws CloneNotSupportedException
    {
        System.out.println("clone a cell obj.");
        return (Cell) super.clone();
    }
}

使用原型,复制10个拷贝:

package com.pichen.dp.creationalpattern.prototype;

public class Main {

    public static void main(String[] args) throws CloneNotSupportedException {
        Cell prototypeCell = new Cell(888);
        for(int i = 0; i < 10; i++){
            Cell copyCell = (Cell) prototypeCell.clone();
            System.out.println(copyCell.hashCode() + ":" + copyCell.getCellId());
        }
    }
}

观察打印结果,hashcode不同,对象成员属性一致,复制成功:

clone a cell obj.
25840096:888
clone a cell obj.
33040770:888
clone a cell obj.
23930419:888
clone a cell obj.
15142448:888
clone a cell obj.
22316618:888
clone a cell obj.
3969559:888
clone a cell obj.
10175206:888
clone a cell obj.
21307627:888
clone a cell obj.
24389376:888
clone a cell obj.
11317592:888

该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。

原型类:

public class Prototype implements Cloneable {  
  
    public Object clone() throws CloneNotSupportedException {  
        Prototype proto = (Prototype) super.clone();  
        return proto;  
    }  
}  

很简单,一个原型类,只需要实现Cloneable接口,覆写clone方法,此处clone方法可以改成任意的名称,因为Cloneable接口是个空接口,你可以任意定义实现类的方法名,如cloneA或者cloneB,因为此处的重点是super.clone()这句话,super.clone()调用的是Object的clone()方法,而在Object类中,clone()是native的.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值