设计模式-原型模式
博客专区 > song316 的博客 > 博客详情
设计模式-原型模式
song316 发表于1年前
设计模式-原型模式
  • 发表于 1年前
  • 阅读 5
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

原型模式介绍

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

类图

原型模式

优点

  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;
    }
}
共有 人打赏支持
粉丝 2
博文 9
码字总数 1085
×
song316
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: