享元模式
享元模式,关键在一个享字上。为什么要进行共享,主要有两种原因,一种是有些对象创建时消耗资源比较大,当频次很高时,系统的性能受到显著影响,第二种是创建对象太多,内存占用过大,且这些对象并不是一直都在用。
典型的应用场景是数据库连接池。该模式主要涉及两个角色,一个是享元角色(Flyweight),一个是享元工厂(FlyweightFactory),两个类之间是聚合关系。
代码示例
/**
* @author Created by njy on 2023/6/21
* 1.抽象享元类(FlyWeight):单车
* 单车有很多共同的信息比如:价格、颜色
*/
public abstract class Bike {
protected String color;
protected int price;
public Bike(String color,int price){
this.color=color;
this.price=price;
}
//展示单车信息
public abstract void show();
}
/**
* @author Created by njy on 2023/6/21
* 2.具体享元类(ConcreteFlyWeight):摩拜单车
*/
public class Mobike extends Bike{
public Mobike(String color,int price){
super(color,price);
}
@Override
public void show() {
System.out.println("生产成功:摩拜单车——"+color+","+"起步价"+price+"元");
}
}
/**
* @author Created by njy on 2023/6/21
* 2.具体享元类(ConcreteFlyWeight):美团单车
*/
public class MTBike extends Bike{
public MTBike(String color,int price){
super(color,price);
}
@Override
public void show() {
System.out.println("生产成功:小黄车——"+color+","+"起步价"+price+"元");
}
}
/**
* @author Created by njy on 2023/6/21
* 3.享元工厂类(FlyWeightFactory):单车工厂
*/
public class BikeFactory {
//map缓存
public static Map<String,Bike> bikeMap=new HashMap<>();
public static Bike getBike(String color,String type){
String key=color+"_"+type;
if(bikeMap.containsKey(key)){
//如果已经有该颜色和类型的单车,直接返回
return bikeMap.get(key);
}else {
Bike bike=null;
//没有,创建并放入缓存
if("mobike".equals(type)){
bike=new Mobike(color,1);
}else if ("MT".equals(type)){
bike=new MTBike(color,2);
}else {
System.out.println("抛异常!没有该类型的单车");
}
//放入缓存
bikeMap.put(key,bike);
return bike;
}
}
}
/**
* @author Created by njy on 2023/6/21
* 享元模式测试类
*/
@SpringBootTest
public class TestFlyweight {
@Test
void testFlyweight(){
//摩拜单车
Bike bike1 = BikeFactory.getBike("黑色", "mobike");
//美团单车
Bike bike2 = BikeFactory.getBike("黑色", "MT");
bike1.show();
bike2.show();
System.out.println("总共有"+BikeFactory.bikeMap.size()+"种类型单车");
System.out.println("--------创建相同类型和颜色的单车----------");
Bike bike3 = BikeFactory.getBike("黑色", "mobike");
bike3.show();
//再次看有多少类型
System.out.println("总共有"+BikeFactory.bikeMap.size()+"种类型单车");
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!