原型模式,孙悟空都会用,猴毛变出的小猴子!

50 篇文章 0 订阅
44 篇文章 0 订阅

大家好呀,今天又又又是设计模式的一天!跟着洪爵轻松学完设计模式~

​ 今天要讲的是原型模式,大家可能都听过原型模式,因为在spring中你可以给bean配置成原型模式,或者是单例模式,如果是原型模式,那么每次去获取这个bean的时候,都会去生成一个新的对象

​ 原型模式,是一种创建型模式它用在创建重复的对象的场景,并且保证它的性能。原型模式需要实现Cloneable接口,那么既然每次返回的都是一个新对象,那么我为什么不直接使用new呢?洪爵知道大家有这样的问题,所以也写有相关的文章,贴在了本篇文章的下方啦!其实通俗的说,clone是本地方法,基于内存的二进制流的复制,在性能上比直接new一个对象会更加的高效,并且还有一点很重要,就是内存的优化上,具体可以看洪爵的文章,已经贴在本篇文章下方

​ 那么为什么叫做原型模式?它一开始会获取到一个对象,这个对象是我们告诉它的,然后它会根据这个原有的原型对象,快速地生成和原型对象一样的实例对象

我们抽象出一个原型类,Prototype,实现了Cloneable接口。

然后具体的原型类ConcretePrototype可以继承自抽象原型类Prototype。

最后需要有一个保存每个具体原型对象的地方A,当需要创建具体原型类的时候,直接从地方A去拿到原型对象进行克隆,返回一个新的对象

在这里插入图片描述

上代码,充分了解原型模式:

public abstract class Ball implements Cloneable {

    private String id;
    protected String name;
    
    abstract void show();

    public String getName() {
        return this.name;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getId() {
        return id;
    }

    public Object clone() {
        Object clone = null;
        try {
            clone = super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return clone;
    }
}

public class Badminton extends Ball {

    public Badminton() {
        this.name = "羽毛球";
    }

    void show() {
        System.out.println(name + "呀");
    }
}

public class Basketball extends Ball {

    public Basketball() {
        name = "篮球";
    }

    void show() {
        System.out.println(name + "呀");
    }
}

public class TableTennis extends Ball {

    public TableTennis() {
        name = "乒乓球";
    }

    void show() {
        System.out.println(name + "呀");
    }
}

public class BallCache {

    private static ConcurrentHashMap<String, Ball> ballMap = new ConcurrentHashMap();

    static {
        Basketball basketball = new Basketball();
        basketball.setId("1");
        ballMap.put(basketball.getId(), basketball);

        Badminton badminton = new Badminton();
        badminton.setId("2");
        ballMap.put(badminton.getId(), badminton);

        TableTennis tableTennis = new TableTennis();
        tableTennis.setId("3");
        ballMap.put(tableTennis.getId(), tableTennis);
    }



    public static Ball getBall(String id) {
        Ball ball = ballMap.get(id);
        return (Ball) ball.clone();
    }
}

public class Client {
    public static void main(String[] args) {

        Badminton badminton1 = (Badminton) BallCache.getBall("2");
        Basketball basketball1 = (Basketball) BallCache.getBall("1");
        TableTennis tableTennis1 = (TableTennis) BallCache.getBall("3");

        badminton1.show();
        basketball1.show();
        tableTennis1.show();

        Badminton badminton2 = (Badminton) BallCache.getBall("2");
        Basketball basketball2 = (Basketball) BallCache.getBall("1");
        TableTennis tableTennis2 = (TableTennis) BallCache.getBall("3");

        badminton2.show();
        basketball2.show();
        tableTennis2.show();

        System.out.println(badminton1.equals(badminton2));
        System.out.println(basketball1.equals(basketball2));
        System.out.println(tableTennis1.equals(tableTennis2));
    }
}

羽毛球呀
篮球呀
乒乓球呀
羽毛球呀
篮球呀
乒乓球呀
false
false
false

​ 好啦,希望本篇文章有助你了解原型模式,孙悟空猴毛变出的小猴子,到底是不是使用的原型模式呢?下方留言告诉我
在这里插入图片描述

愿每个人都能带着怀疑的态度去阅读文章并探究其中原理。

道阻且长,往事作序,来日为章。

期待我们下一次相遇!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KnightHONG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值