美文网首页
创建型-原型(Prototype)

创建型-原型(Prototype)

作者: DoneWillianm | 来源:发表于2020-09-16 23:25 被阅读0次

原型(Prototype)

[TOC]

定义

Specify the kinds of objects to create using a prototypical instance,and create new objects bycopying this prototype.(用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。)

原型模式在Java中的应用其实就是clone接口的使用,该模式的要点在于思考拷贝的特点和应用以及深/浅拷贝的知识点

简单场景使用

惯例,英雄联盟克隆大作战,所有玩家使用同一个英雄,我们作为游戏开发者,如果用户每每选定的同一个英雄在实际创建的时候,都去new,那么每次都会经过对象的构造过程,一些初始化赋值的操作等等,那么这个时候其实我们可以仅new一次英雄对象,在提供给玩家的时候就直接clone,省去构造的过程,对性能有所提升,同时又不会影响到别的玩家使用同样的英雄

coding

英雄对象,简单在构造中打印一下

public class Hero implements Cloneable{
    private String name;
    public String type;

    public Hero(String name, String type) {
        this.name = name;
        this.type = type;
        System.out.println(String.format("构造英雄 name:%s, type:%s", name, type));
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    @Override
    protected Hero clone() {
        Hero hero = null;
        try {
            hero = (Hero) super.clone();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return hero;
    }

    @Override
    public String toString() {
        return "Hero{" +
                "name='" + name + '\'' +
                ", type='" + type + '\'' +
                '}';
    }
}

静态工厂产生英雄

public class HeroFactory {

    public static Hero hero = new Hero("ez", "ad");

    public static Hero createEz() {
        return hero.clone();
    }

    public static Hero createAxy() {
        Hero hero = HeroFactory.hero.clone();
        hero.setName("Axy");
        return hero;
    }
}

最后直接运行

    public static void main(String[] args) {
        Hero ez = HeroFactory.createEz();
        Hero axy = HeroFactory.createAxy();
        System.out.println("ez: " + ez.toString());
        System.out.println("axy:" + axy);
    }

//    构造英雄 name:ez, type:ad
//    ez: Hero{name='ez', type='ad'}
//    axy:Hero{name='Axy', type='ad'}

可以看到打印结果构造仅执行了一次,在构造艾希的时候我们仅需要修改艾希的名字即可,省略给他设置type的步骤

实际场景使用

既然提到原型模式考究的是clone的使用,那么在什么场景下会去应用拷贝这样的方式呢?其实个人理解在数据model在多个线程中间传递和使用的时候可以进行使用,为什么这么说呢? `其实在我们请求网络的时候,考虑下再观察者模式下的运行效果,我们需要分发数据model,而对于调用者我们并不清楚上层的开发者会对这个数据model做出getter还是setter操作,如果是写的话,就可能会影响到其他观察者的处理,而这时候就可以应用咱们的clone方式,保证数据在传输过程中不被篡改

相关文章

网友评论

      本文标题:创建型-原型(Prototype)

      本文链接:https://www.haomeiwen.com/subject/ihatyktx.html