设计模式之享元模式

发布于:2023-01-06 ⋅ 阅读:(409) ⋅ 点赞:(0)

什么是设计模式
设计模式是经常使用、大多数人知道,有特定目录的代码设计经验。设计模式可以提高代码可维护性,可提升代码运行效率,也能提高系统可靠性。设计模式可以分为三类,分别是创建型、结构型和行为型。以下就享元模式简要概述。

什么是享元模式
享元模式就是减少对象创建数量,减少系统内存占用。说直白就是重复使用对象,就像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 名称: 员工角色

本文含有隐藏内容,请 开通VIP 后查看