什么是享元模式?为什么要使用享元模式?
享元模式属于结构型设计模式。 享元模式主要是为了解决大量对象创建后,增大了系统的资源开销,为了解决此问题,该模式通过共享对象的方式实现。既然是共享肯定有一定结构和策略。
通俗易懂的举个例子:
我们生活当中需要使用共享单车,自行车,电动车,你没有扫码的时候是不用不了,你骑了别人是不是就使用不了,那么别人在使用的时候你自然就使用不了,那么这个车在没有骑的时候是不是就恢复了没有使用的状态。那么我们可以得出结论,都不使用需要回收,你使用别人就不能使用,别人使用你就不能使用,也就是共享这个资源,那我们就需要初始化提供资源给你或者别人,从而达到共享使用。
如何理解这个图?
共享终端:初始化一批共享单车,共享单车的状态
共享单车:提供单车的状态,数量,价格,唯一编号标识等。
用户:人
编码:
定义接口:
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 ,只要是使用了初始化缓存基本都是享元设计模式。
那么享元设计模式在我们开发业务当中的业务场景:需要数据初始化,基础数据的运营,需要共享数据多个服务的时候都可以使用享元设计模式。
————没有与生俱来的天赋,都是后天的努力拼搏(我是小杨,谢谢你的关注和支持)