享元模式

概述

当一个系统中存在大量重复对象的时候,如果这些重复的对象是不可变的对象,我们就可以利用享元模式将对象设计成享元,在内存中只保留一份实例,供多处代码引用。这样可以减少内存中对象的数量,起到节省内存的目的。

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);
        
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值