概念
使共享对象可以有效的支持大量的细粒度对象。主要采用池技术实现。
理解
享元模式主要解决大量对象的共享,实现内部对象的状态一致性,和外部状态对内部状态的使用。简单理解就是,在JAVA的基础数据类型中,String、Integer、Character等类型均会在创建时缓存一定范围的数据,较少创建和销毁对象花费的时间。
所以,该模式主要涉及以下部分:内部状态、外部状态、外部状态转换为内部状态的工厂、利用外部状态的客户端。
实现
创建内部状态
定义团队抽象类:
package cn.sh.designepattern;
/** 定义团队抽象类
* @Author song
* @Version 0.0.1
* @Date 2025/4/24 14:23
* @Contact 643947568@qq.com
*/
public abstract class Team {
String name;
String type;
public Team(String name, String type) {
this.name = name;
this.type = type;
}
public abstract void attendCompetition();
}
定义内部状态具体实现:
package cn.sh.designepattern;
/**
* @Author song
* @Version 0.0.1
* @Date 2025/4/24 14:26
* @Contact 643947568@qq.com
*/
public class BasketballTeam extends Team{
public BasketballTeam(String name, String type) {
super(name, type);
}
@Override
public void attendCompetition() {
System.out.println("篮球队参赛");
}
}
package cn.sh.designepattern;
/**
* @Author song
* @Version 0.0.1
* @Date 2025/4/24 14:26
* @Contact 643947568@qq.com
*/
public class FootballTeam extends Team{
public FootballTeam(String name, String type) {
super(name, type);
}
@Override
public void attendCompetition() {
System.out.println("足球队参数");
}
}
定义享元工厂
package cn.sh.designepattern;
import java.util.HashMap;
import java.util.Map;
/**
* @Author song
* @Version 0.0.1
* @Date 2025/4/24 14:29
* @Contact 643947568@qq.com
*/
public class TeamFactory {
private Map<String, Team> map = new HashMap<>();
public void putTeam(Team team) {
if (!map.containsKey(team.name)) {
map.put(team.name, team);
}
}
public Team getTeam(String name) {
return map.get(name);
}
}
测试
package cn.sh.designepattern;
/**
* @Author song
* @Version 0.0.1
* @Date 2025/4/24 10:47
* @Contact 643947568@qq.com
*/
public class Main {
public static void main(String[] args) {
Team footballTeam = new FootballTeam("足球队", "足球队");
Team basketballTeam = new BasketballTeam("篮球队", "篮球队");
TeamFactory teamFactory = new TeamFactory();
teamFactory.putTeam(footballTeam);
teamFactory.putTeam(basketballTeam);
teamFactory.getTeam("足球队").attendCompetition();
teamFactory.getTeam("篮球队").attendCompetition();
}
}
适用性
享元模式可以通过缓存常用的对象在内存中,以节省对象的创建和销毁的时间,从而提高系统的加载速度。
不过缓存太多的对象会导致内存的大量占用,还需要视实际情况而定。