Java设计模式之身外身法之术——原型模式

2023-06-1709:09:09软件工程与架构Comments1,617 views字数 3059阅读模式

一.什么是原型模式

原型模式是23种设计模式中创建型模式的一种,它关注的是用一个已经存在的实例对象作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/arc/47364.html

二.生活中的原型模式

1.孙悟空

孙悟空有独一无二的法宝如意金箍棒和众多法术,其中有一个名为身外身法的道术,孙悟空拔身上的毛幻化出另一个自己,这个大家应该有印象吧,这个幻化出新的分身就跟设计模式中的原型模式很相似。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/arc/47364.html

Java设计模式之身外身法之术——原型模式

2.哪吒

哪吒不管是西游记还是封神榜中都出现过,也是所喜欢的中国神话人物之一,哪吒虽然没有孙悟空会身外身法,但是他会三头六臂,通过这个法术,哪吒会变换出2个新的头颅和2对新的手臂,而这个三头六臂是以头或者手臂为参照物变化出来的,就跟设计模式中的原型模式很相似。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/arc/47364.html

Java设计模式之身外身法之术——原型模式

3.漩涡鸣人

旋涡鸣人是日本漫画中火影忍者的人物,影分身之术是他最厉害的忍术之一。这个忍术是能够变幻出多个相同的自己,以自己为参照物根据查克拉的量来变幻出不同的数量,这就跟设计模式中的原型模式很相似。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/arc/47364.html

Java设计模式之身外身法之术——原型模式

三.原型模式的实现

接下来以孙悟空的身外身法之术来举例,通过原型模式来实现。先创建一个武器类,再创建一个孙悟空的类并实现克隆接口文章源自菜鸟学院-https://www.cainiaoxueyuan.com/arc/47364.html

package com.qianfeng.ran;

/*
* @author:江帅
*      孙悟空类
*/
public class SunWuKong implements Cloneable{
    //名字
    private String name;
    //武器
    private Weapon weapon;

    public SunWuKong() {
    }

    public SunWuKong(String name, Weapon weapon) {
        this.name = name;
        this.weapon = weapon;
    }

    public String getName() {
        return name;
    }

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

    public Weapon getWeapon() {
        return weapon;
    }

    public void setWeapon(Weapon weapon) {
        this.weapon = weapon;
    }

    @Override
    public String toString() {
        return "SunWuKong{" +
            "name='" + name + ''' +
            ", weapon=" + weapon +
            '}';
    }

    //身外身之术
    @Override
    protected Object clone() throws CloneNotSupportedException {
        //通过 Object 类的 clone() 克隆出新的孙悟空
        SunWuKong sunWuKong = (SunWuKong)super.clone();
        //新的分身名等同当前名
        sunWuKong.setName(name);
        //新的分身手持同样的武器,但为新的对象
        sunWuKong.setWeapon(new Weapon(weapon.getName(),weapon.getSource()));
        return sunWuKong;
    }
}


/*
 * @author:江帅
 *      武器类
 */
public class Weapon {
    //武器名
    private String name;
    //来源
    private String source;

    public Weapon() {
    }

    public Weapon(String name, String source) {
        this.name = name;
        this.source = source;
    }

    public String getName() {
        return name;
    }

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

    public String getSource() {
        return source;
    }

    public void setSource(String source) {
        this.source = source;
    }

    @Override
    public String toString() {
        return "Weapon{" +
                "name='" + name + ''' +
                ", source='" + source + ''' +
                '}';
    }
}

最后通过原型模式来创建孙悟空的分身。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/arc/47364.html

package com.qianfeng.ran;

/*
 * @author:江帅
 *      客户端
 */
public class Demo {
    public static void main(String[] args) throws CloneNotSupportedException {
        //phantom
        //创建孙悟空对象,拥有东海龙宫的如意金箍棒
        SunWuKong sunWuKong = new SunWuKong("孙悟空",new Weapon("如意金箍棒","东海龙宫"));
        //调用克隆方法创建2个分身    --  身外身之术
        SunWuKong phantom1 = (SunWuKong)sunWuKong.clone();
        SunWuKong phantom2 = (SunWuKong)sunWuKong.clone();

        //执行结果:
        //SunWuKong{name='孙悟空', weapon=Weapon{name='如意金箍棒', source='东海龙宫'}}
        System.out.println(sunWuKong.toString());
        //执行结果:
        //SunWuKong{name='孙悟空', weapon=Weapon{name='如意金箍棒', source='东海龙宫'}}
        System.out.println(phantom1.toString());
        //执行结果:
        //SunWuKong{name='孙悟空', weapon=Weapon{name='如意金箍棒', source='东海龙宫'}}
        System.out.println(phantom2.toString());

        //改变分身的武器和出产地
        phantom1.getWeapon().setName("芭蕉扇");
        phantom1.getWeapon().setSource("火焰山");
        phantom2.getWeapon().setName("紫金红葫芦");
        phantom2.getWeapon().setSource("太上老君");

        //执行结果:
        //SunWuKong{name='孙悟空', weapon=Weapon{name='如意金箍棒', source='东海龙宫'}}
        //执行结果:
        System.out.println(sunWuKong.toString());
        //执行结果:
        //SunWuKong{name='孙悟空', weapon=Weapon{name='芭蕉扇', source='火焰山'}}
        System.out.println(phantom1.toString());
        //执行结果:
        //SunWuKong{name='孙悟空', weapon=Weapon{name='紫金红葫芦', source='太上老君'}}
        System.out.println(phantom2.toString());
    }
}

四.总结

Java中克隆新的对象会产生相同的引用,改变克隆对象的内容会改变到原型对象,这个属于浅拷贝,就像咱们的案例,如果用的是浅拷贝,打印结果会是3个武器都是来自太上老君的紫金红葫芦。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/arc/47364.html

而使用原型模式克隆出来的对象则跟原型对象不是同一个地址,改变克隆对象不会影响原型对象,这个属于深拷贝,如案例所示每个对象里的内容不会因为别的对象的改变而改变。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/arc/47364.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/arc/47364.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定