JAVA设计模式-原型模式

一、概念

    通过复制生成实例

二、代码

定义一个原型接口,实现Cloneable

public interface Prototype extends Cloneable{
    /**
     * 创建克隆对象
     * @return 具体原型实例
     */
    Prototype createClone();
}

实现原型接口的具体的原型类,实现createClone方法,使用Object的clone方法克隆生成实例

public class ConcretePrototype implements Prototype{
    //记录一下模型名称
    private String mould;
    public ConcretePrototype(String mould) {
        this.mould = mould;
    }
    @Override
    public Prototype createClone() {
        Prototype prototype = null;
        try {
            prototype = (Prototype) this.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return prototype;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("ConcretePrototype{");
        sb.append("mould='").append(mould).append('\'');
        sb.append('}');
        sb.append("  "+super.toString());
        return sb.toString();
    }
}

定义一个原型管理类PrototypeManeger,维护原型实例

public class PrototypeManager {
    //维护原型实例
    private static Map<String,Prototype> prototypeCase = new HashMap<>();
    public void register(String name, Prototype proto) {
        prototypeCase.put(name, proto);
    }
    public Prototype create(String protoName) {
        Prototype proto = prototypeCase.get(protoName);
        return proto.createClone();
    }
}

 main方法使用

public static void main(String[] args) {
        //创建一个原型管理
        PrototypeManager prototypeManager = new PrototypeManager();
        //生成并维护firstCase与lastCase两个原型
        prototypeManager.register("firstCase",new ConcretePrototype("firstCase"));
        prototypeManager.register("lastCase",new ConcretePrototype("lastCase"));
        //通过原型管理创建实例
        Prototype firstCase = prototypeManager.create("firstCase");
        System.out.println(firstCase);
        Prototype lastCase1 = prototypeManager.create("lastCase");
        System.out.println(lastCase1);
        Prototype lastCase2 = prototypeManager.create("lastCase");
        System.out.println(lastCase2);
    }

结果

ConcretePrototype{mould='firstCase'}  designpattern.prototype_pattern.ConcretePrototype@60e53b93
ConcretePrototype{mould='lastCase'}  designpattern.prototype_pattern.ConcretePrototype@5e2de80c
ConcretePrototype{mould='lastCase'}  designpattern.prototype_pattern.ConcretePrototype@1d44bcfa

三、类结构

核心类为Prototype,继承了Cloneable,使得其实现类具有了拷贝能力

原型模式类图

四、用途

1. 对象的种类比较多的时候,比如打游戏时,不同区域或副本的怪物等级血量不一样,副本又很多,那就每个副本的小怪都维护一个原型,怪物生成就直接基于该原型进行克隆

2. 对象的生成过程比较复杂,使用原型模式,只需要执行一次改复杂的过程生成原型,然后之后生成对象都基于该原型进行克隆

3. 解耦对象管理与对象生成, PrototypeManager与Prototype具有通用性,可与ConcretePrototype进行解耦。

五、其他说明

1. Cloneable是个标记接口,内部没有方法,clone()方法时Object类提供的,再使用clone方法时,如果类没有实现Cloneable(标记),则会抛出CloneNotSupportedException。

public interface Cloneable {
}

2. Object的clone方法是分配一个与被复制对象一样大小的内存空间,将被复制对象的字段值复制到所分配的空间。

3. Object的clone是一个浅拷贝,只是复制了字段值,例如字段是一个List,那么复制的是指该List的引用,也就是被复制的对象与新生成的对象的该字段是同一个List,该情况需要自己实现clone方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值