概述
当一个系统中存在大量重复对象的时候,如果这些重复的对象是不可变的对象,我们就可以利用享元模式将对象设计成享元,在内存中只保留一份实例,供多处代码引用。这样可以减少内存中对象的数量,起到节省内存的目的。
demo
享元模式,主要是创建一个Map或者List来缓存已经创建号的享元对象,以达到复用的目的,当然这个Map或者List也可以抽取出来,放在工厂类种
public class ChessPieceUnit {
private static final Map<String, ChessPieceUnit> chessMap = new ConcurrentHashMap<>();
private int id;
private String text;
private simpleColor color;
static {
chessMap.put("1",new ChessPieceUnit(1,"车",simpleColor.BLUE));
chessMap.put("2",new ChessPieceUnit(2,"马",simpleColor.BLUE));
}
public ChessPieceUnit() {
}
public ChessPieceUnit(int id, String text, simpleColor color) {
this.id = id;
this.text = text;
this.color = color;
}
private enum simpleColor{
RED("红色"),BLUE("蓝色");
private String colorName;
private simpleColor(String color){
this.colorName = color;
}
}
public ChessPieceUnit getChessPieceUnit(String serialNumber){
return chessMap.get(serialNumber);
}
@Override
public String toString() {
return "ChessPieceUnit{" +
"id=" + id +
", text='" + text + '\'' +
", color=" + color +
'}';
}
public static void main(String[] args) {
ChessPieceUnit chessPieceUnit = new ChessPieceUnit();
ChessPieceUnit chessPieceUnit1 = chessPieceUnit.getChessPieceUnit("1");
System.out.println(chessPieceUnit1);
}
}
使用List的时候,记得在类中重写equals方法,根据equals方法中的值,去找相应的对象
public class ChessPieceUnitData {
private static final List<ChessPieceUnitData> chessList = new LinkedList<>();
private int id;
private String text;
private Color color;
static {
chessList.add(new ChessPieceUnitData(1,"车",Color.BLUE));
chessList.add(new ChessPieceUnitData(2,"马", Color.BLUE));
}
public ChessPieceUnitData() {
}
public ChessPieceUnitData(int id, String text, Color color) {
this.id = id;
this.text = text;
this.color = color;
}
@Override
public boolean equals(Object obj) {
ChessPieceUnitData chessPieceUnitData = (ChessPieceUnitData) obj;
return chessPieceUnitData.id==this.id&&chessPieceUnitData.text.equals(this.text)&&chessPieceUnitData.color==this.color;
}
public ChessPieceUnitData getChessPieceUnit(Integer id,String text,Color color){
ChessPieceUnitData chessPieceUnitData = new ChessPieceUnitData(id,text,color);
for (ChessPieceUnitData chess: chessList){
if (chess.equals(chessPieceUnitData)){
return chessPieceUnitData;
}
}
return null;
}
@Override
public String toString() {
return "ChessPieceUnit{" +
"id=" + id +
", text='" + text + '\'' +
", color=" + color +
'}';
}
public static void main(String[] args) {
ChessPieceUnitData chessPieceUnit = new ChessPieceUnitData();
ChessPieceUnitData chessPieceUnit1 = chessPieceUnit.getChessPieceUnit(1,"车",Color.BLUE);
System.out.println(chessPieceUnit1);
}
}