java设计模式之享元模式通俗易懂

什么是享元模式?为什么要使用享元模式?

享元模式属于结构型设计模式。 享元模式主要是为了解决大量对象创建后,增大了系统的资源开销,为了解决此问题,该模式通过共享对象的方式实现。既然是共享肯定有一定结构和策略。

通俗易懂的举个例子:

我们生活当中需要使用共享单车,自行车,电动车,你没有扫码的时候是不用不了,你骑了别人是不是就使用不了,那么别人在使用的时候你自然就使用不了,那么这个车在没有骑的时候是不是就恢复了没有使用的状态。那么我们可以得出结论,都不使用需要回收,你使用别人就不能使用,别人使用你就不能使用,也就是共享这个资源,那我们就需要初始化提供资源给你或者别人,从而达到共享使用。

 如何理解这个图?

共享终端:初始化一批共享单车,共享单车的状态

共享单车:提供单车的状态,数量,价格,唯一编号标识等。

用户:人

编码:

 

定义接口:

package com.xy.design.flyweight.service;

/**
 * <p>
 *
 * @author yang
 * @since 2022-09-30
 */
public interface FlyweightSharedService {

    void useCar();
}

接口实现类:

package com.xy.design.flyweight.service;

/**
 * <p>
 *
 * @author yang
 * @since 2022-09-30
 */
public class BikeFlyweightImpl implements FlyweightSharedService{
    private String userId;

    public BikeFlyweightImpl(String userId) {
        this.userId = userId;
    }
    @Override
    public void useCar() {
         System.out.println("userid"+userId);
    }
}

定义一个工厂:

package com.xy.design.flyweight;

import com.xy.design.flyweight.service.BikeFlyweightImpl;
import com.xy.design.flyweight.service.FlyweightSharedService;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;


public class FlyweightFactory {
    /**
     * 定义一个缓存
     */
    private static Map<String, FlyweightSharedService> pool = new ConcurrentHashMap<>();

    public static FlyweightSharedService getFlyweight(String userId) {
        if (!pool.containsKey(userId)) {
            FlyweightSharedService flyweight = new BikeFlyweightImpl(userId);
            pool.put(userId, flyweight);
        }
        return pool.get(userId);
    }
}

测试类:

package com.xy.design.flyweight;

import com.xy.design.flyweight.service.FlyweightSharedService;

/**
 * <p>
 *
 * @author yang
 * @since 2022-09-24
 */
public class Test {
    public static void main(String[] args) {
        FlyweightSharedService flyweightSharedService =  FlyweightFactory.getFlyweight("87123123");
        flyweightSharedService.useCar();
    }
}

上面的代码的含义:我们需要用工厂去初始化我们需要的车辆信息,也就是像我们的线程池提前分配好资源,存入缓存,这样我们在使用的时候只需要关注内部状态实现细节即可,多个拓展实现直接加入到工厂里面去分配,从而达到了一个可复用,易回收的作用,但是这种模式需要关注线程的一个安全问题,我们可以通过隔离线程的可见性和原子性来保证线程安全问题。

享元模式在java当中用的相当多:我们的线程池,java转换比如Integer,String ,只要是使用了初始化缓存基本都是享元设计模式。

那么享元设计模式在我们开发业务当中的业务场景:需要数据初始化,基础数据的运营,需要共享数据多个服务的时候都可以使用享元设计模式。

 ————没有与生俱来的天赋,都是后天的努力拼搏(我是小杨,谢谢你的关注和支持)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小杨互联网

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

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

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

打赏作者

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

抵扣说明:

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

余额充值