享元模式,世界如此简单!

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

在这里插入图片描述

大家好鸭!我是洪爵,又到了设计模式的时间啦~今天带给大家的是享元模式

​ 什么是享元模式捏?

​ 首先,享元模式是一种结构型模式,那么啥是结构型模式?结构型模式更关注类和对象的组合。享元模式主要用于减少对象创建的数量,提高系统性能,减少内存消耗。那么它是怎么做的?享元模式旨在尝试重用现有的同类对象,如果找不到才创建

​ 享元模式也被广泛的应用在各个场景,比如说池技术,String常量池,数据库连接池,缓冲池等等

​ 那么享元模式它是怎么做到的呢?享元模式把其中共同的部分都抽象出来,如果有相同的需求,那么只需要返回内存中存在的这个对象就可以避免重复的去创建对象

​ 同时的,享元模式需要结合工厂模式辅助进行,不用担心,洪爵同时把工厂模式文章也放了出来呀!

​ 享元模式会存有2种数据,一个是共享数据internalData,这部分数据是不会改变的;另外一个是externalData外部数据,这部分数据是不可以共享的,随时会改变。
在这里插入图片描述
享元模式主要包括以下几种角色:

抽象的享元类(FlyWeight):抽象出享元的基类或者接口,定义外部状态的接口,通过传参传入外部状态。

具体享元类(ConcreteFlyWeight):实现抽象享元类,为内部数据提供空间存储,同时实现operation方法。

享元工厂(FlyweightFactory):负责创建和管理享元对象。

客户端(Client):调用和获取具体对象。

上代码:

public interface FlyWeight {
    void operation(String externalData);
}
public class ConcreteFlyWeight implements FlyWeight {

    private String internalData;

    public ConcreteFlyWeight(String internalData) {
        this.internalData = internalData;
    }

    public void operation(String externalData) {
        System.out.println("internalData = " + this.internalData);
        System.out.println("externalData = " + externalData);
        System.out.println("-------------------------------");
    }
}
public class FlyweightFactory {
    private static Map<String, ConcreteFlyWeight> pool = new ConcurrentHashMap<String, ConcreteFlyWeight>();

    public static ConcreteFlyWeight getInstance(String internalData) {
        if(pool.containsKey(internalData)) {
            return pool.get(internalData);
        }
        System.out.println("first time to create " + internalData);
        ConcreteFlyWeight concreteFlyWeight = new ConcreteFlyWeight(internalData);
        pool.put(internalData, concreteFlyWeight);

        return pool.get(internalData);
    }
}
public class Client {

    public static void main(String[] args) {
        ConcreteFlyWeight concreteFlyWeight = FlyweightFactory.getInstance("美团");
        concreteFlyWeight.operation("下订单1");

        concreteFlyWeight = FlyweightFactory.getInstance("美团");
        concreteFlyWeight.operation("下订单2");

        concreteFlyWeight = FlyweightFactory.getInstance("饿了吗");
        concreteFlyWeight.operation("下订单1");

        concreteFlyWeight = FlyweightFactory.getInstance("饿了吗");
        concreteFlyWeight.operation("下订单2");

        concreteFlyWeight = FlyweightFactory.getInstance("美团");
        concreteFlyWeight.operation("下订单3");
    }

}
first time to create 美团
internalData = 美团
externalData = 下订单1
-------------------------------
internalData = 美团
externalData = 下订单2
-------------------------------
first time to create 饿了吗
internalData = 饿了吗
externalData = 下订单1
-------------------------------
internalData = 饿了吗
externalData = 下订单2
-------------------------------
internalData = 美团
externalData = 下订单3
-------------------------------

好啦,享元模式就讲到这里啦,世界竟如此简单呀!
在这里插入图片描述
愿每个人都能带着怀疑的态度去阅读文章并探究其中原理。

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

期待我们下一次相遇!

  • 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、付费专栏及课程。

余额充值