什么是设计模式
设计模式是经常使用、大多数人知道,有特定目录的代码设计经验。设计模式可以提高代码可维护性,可提升代码运行效率,也能提高系统可靠性。设计模式可以分为三类,分别是创建型、结构型和行为型。以下就享元模式简要概述。
什么是享元模式
享元模式就是减少对象创建数量,减少系统内存占用。说直白就是重复使用对象,就像Spring容器将所有的对象创建并缓存起来供后续流程调用。这种模式也是结构型模式。
应用场景
1、系统需要大量使用重复对象,为了降低内存占用的情况。
小试牛刀
比如我们系统有多种角色,每种角色会多次使用,此时我们可以用享元模式来满足角色对象的复用。
首先我们新增一个角色接口Role,并提供展示方法showRole。然后,我们自定义一个角色对象MyRole提供角色类型和名称并复写展示角色的方法。最后我们通过工厂模式创建我的角色,并提供外部消费者调用的方法。
依赖关系为:
1、创建角色接口并提供展示角色的方法
/**
* 角色接口
* @author senfel
* @version 1.0
* @date 2022/8/23 13:53
*/
public interface Role {
void showRole();
}
2、自定义我的角色并实现角色接口,我的角色提供角色类型和名称
/**
* 我的角色
* @author senfel
* @version 1.0
* @date 2022/8/23 14:33
*/
@Data
public class MyRole implements Role{
/**类型标识*/
public static final String ROLE_TYPE_BY_SUPER = "ROLE_TYPE_BY_SUPER";
public static final String ROLE_TYPE_BY_EMPLOYEE = "ROLE_TYPE_BY_EMPLOYEE";
public static final String ROLE_TYPE_BY_CUSTOMER = "ROLE_TYPE_BY_SUPER";
/**类型*/
private String type;
/*** 名称*/
private String name;
public MyRole(String type) {
this.type = type;
}
@Override
public void showRole() {
System.err.println("我的角色》》 类型: "+type+" 名称: "+name);
}
}
3、提供一个角色创建工厂用来创建角色,创建的角色放入缓存并减少内存占用
/**
* 角色工厂
* @author senfel
* @version 1.0
* @date 2022/8/23 14:36
*/
public class RoleFactory {
/**角色缓存*/
private static Map<String,Role> roleMap = new HashMap<>();
/**
* 获取角色
* 如果没有在缓存找到就创建一个该类型角色放入
* @param type
* @return
*/
public static MyRole getRole(String type){
MyRole role =(MyRole)roleMap.get(type);
if(Objects.isNull(role)){
role = new MyRole(type);
}
return role;
}
}
4、测试享元模式,多次需要某一个特殊的对象则直接到缓存中拿
/**
* 享元模式测试
* @author senfel
* @version 1.0
* @date 2022/8/23 14:45
*/
@SpringBootTest
public class TestFlyweightPattern {
@Test
public void test(){
for(int i=0;i<10;i++){
if(i % 2 == 0){
MyRole role = RoleFactory.getRole(MyRole.ROLE_TYPE_BY_SUPER);
role.setName("超级角色");
role.showRole();
}else if(i % 3 == 0){
MyRole emp = RoleFactory.getRole(MyRole.ROLE_TYPE_BY_EMPLOYEE);
emp.setName("员工角色");
emp.showRole();
}else{
MyRole cus = RoleFactory.getRole(MyRole.ROLE_TYPE_BY_CUSTOMER);
cus.setName("客户角色");
cus.showRole();
}
}
}
}
测试结果:
我的角色》》 类型: ROLE_TYPE_BY_SUPER 名称: 超级角色
我的角色》》 类型: ROLE_TYPE_BY_SUPER 名称: 客户角色
我的角色》》 类型: ROLE_TYPE_BY_SUPER 名称: 超级角色
我的角色》》 类型: ROLE_TYPE_BY_EMPLOYEE 名称: 员工角色
我的角色》》 类型: ROLE_TYPE_BY_SUPER 名称: 超级角色
我的角色》》 类型: ROLE_TYPE_BY_SUPER 名称: 客户角色
我的角色》》 类型: ROLE_TYPE_BY_SUPER 名称: 超级角色
我的角色》》 类型: ROLE_TYPE_BY_SUPER 名称: 客户角色
我的角色》》 类型: ROLE_TYPE_BY_SUPER 名称: 超级角色
我的角色》》 类型: ROLE_TYPE_BY_EMPLOYEE 名称: 员工角色