定义
利用共享技术支持大量对象的复用、通过共享已经存在的对象来大幅度减少需要创建对象的数量,换句话说相同的对象只保留一份。
本质
缓存共享对象、降低内存消耗
架构
抽象享元角色、具体享元角色、非享元角色、享元工厂角色
代码
AbstrctFlyWeight(抽象享元)
/**
*
* Description:
* 抽象享元角色
* @author: mushi
* @Date: 2021/2/6 13:31
*/
public interface AbstrctFlyWeight {
void creat(NotFlyWeight notFlyWeight);
}
RealFlyWeight(具体享元)
/**
*
* Description:
* 具体享元角色,用来共享的对象
* @author: mushi
* @Date: 2021/2/6 13:32
*/
public class RealFlyWeight implements AbstrctFlyWeight{
@Override
public void
creat(NotFlyWeight notFlyWeight) {
//操作不共享的对象
notFlyWeight.getName();
}
}
NotFlyWeight(非享元)
/**
*
* Description:
* 非享元角色,不共享的外部状态
* @author: mushi
* @Date: 2021/2/6 13:30
*/
public class NotFlyWeight {
private String name;
public String getName() {
System.out.println("非享元对象被调用");
return name;
}
public void setName(String name) {
this.name = name;
}
}
FlyWeightFactory(享元工厂)
/**
*
* Description:
* 享元角色工厂
* @author: mushi
* @Date: 2021/2/6 13:35
*/
public class FlyWeightFactory {
//储存共享的对象
private Map<String,AbstrctFlyWeight> map = new HashMap<>();
public RealFlyWeight getRealFlyWeight(String k){
RealFlyWeight realFlyWeight = (RealFlyWeight) map.get(k);
if (realFlyWeight!=null){
//对象已经创建并共享
System.out.println("享元对象"+k+"已经创建,可以直接获取使用");
}else{
//创建对象、共享并储存
realFlyWeight = new RealFlyWeight();
map.put(k,realFlyWeight);
}
return realFlyWeight;
}
}
Test
public class Test {
public static void main(String[] args) {
FlyWeightFactory factory = new FlyWeightFactory();
RealFlyWeight a = factory.getRealFlyWeight("a");
NotFlyWeight notFlyWeight = new NotFlyWeight();
notFlyWeight.setName("共享的对象");
a.creat(notFlyWeight);
RealFlyWeight b = factory.getRealFlyWeight("a");
b.creat(notFlyWeight);
}
}
总结
享元的字面意思就是共享元数据,元数据可以理解为对象,也就是共享对象。
个人理解,这个模式是将单例模式和工厂方法模式的一个结合,本质上就是只创建一次对象然后将这个对象用容器给装起来,当你要使用的时候直接根据它在容器中的标识去获取就可以了,这样在你需要这个对象的时候就不用每次都去创建,只需要从容器中去获取。
在单例模式下,对象是交给这个对象的类中的方法去管理,在享元模式中就是创建了一个容器,通过容器去管理,然后可以创建多个容器去管理不同类别的对象。
举个例子,桌子上有一颗荔枝和一个只有一颗荔枝的果盘,单例模式下你想吃荔枝你选择的是那单独的一颗,享元模式下你想吃荔枝的话你要到果盘中去找到荔枝。