享元模式-代码&Integer值的比较

本文探讨了享元模式的概念,它通过缓存复用来减少对象创建,节省内存。以围棋为例,说明享元模式如何应用于棋子对象,区分内部状态和外部状态。同时,分析了Java中Integer类的享元实现,阐述其在特定范围内的缓存机制,以提高性能。
摘要由CSDN通过智能技术生成

UML图:

 代码:

package structure.flyweight;

import java.util.HashMap;
import java.util.Map;

/**
 * 享元模式
 * 利用"缓存"复用来达到对一些细颗粒度对象进行管理,由于对象创建和销毁都需要消耗资源,避免重复大量创建对象,可以理解为工厂模式的升级版
 * 组成:
 * 调用者-main方法或其他
 * 抽象工厂
 * 具体工厂对象-用于提供方法,被调用后去内部"缓存"寻找享元对象,有就返回,无则生成
 * 享元对象-可以被抽象的,第一次被创建后将被缓存到具体工厂中
 * 非享元对象-其中不能被复用抽象的对象(或属性),通过参数形式传到享元对象中
 * 优点:
 * 对于大量重复对象的创建节省了内存空间
 * 缺点:
 * 分了内部状态和外部状态,增加了系统复杂度
 * ===========================================
 * 举例:围棋
 * 思考:"棋子"对象的作用是什么?
 * 用于在棋盘上输出:什么'颜色'的棋子落在了什么'坐标'。
 * 这个棋子对象的生命周期很短而且随着进程会*多次*创建销毁,很没必要并且会浪费多余的资源,将其享元化。
 * 其中落下的'经纬度坐标'是非享元的属性,作为外部属性传入
 */
public class FlyWeight {

    public static void main(String[] args) {
        Chess whiteChess = Factory.getChess(Factory.WHITE);
        Chess blackChess = Factory.getChess(Factory.BLACK);
        Chess whiteChess1 = Factory.getChess(Factory.WHITE);
        Chess blackChess1 = Factory.getChess(Factory.BLACK);
        System.out.println("whiteChess" + whiteChess.toString());
        System.out.println("blackChess" + blackChess.toString());
        System.out.println("whiteChess1" + whiteChess1.toString());
        System.out.println("blackChess1" + blackChess1.toString());
        whiteChess.downChess(11, 22);
        whiteChess.downChess(22, 33);

        blackChess.downChess(111, 222);
        blackChess.downChess(222, 333);

    }
}

//抽象棋子对象
abstract class Chess {

    abstract void downChess(int longitude, int latitude);

}

//具体棋子对象
class WhiteChess extends Chess {

    //下子。其中经纬度是非享元的
    @Override
    void downChess(int longitude, int latitude) {
        System.out.println("WhiteChess down in ".concat(String.valueOf(longitude).concat(",").concat(String.valueOf(latitude))));
    }
}

class BlackChess extends Chess {

    @Override
    void downChess(int longitude, int latitude) {
        System.out.println("BlackChess down in ".concat(String.valueOf(longitude).concat(",").concat(String.valueOf(latitude))));
    }
}

//工厂类
class Factory {

    public static final Integer WHITE = 0;

    public static final Integer BLACK = 1;

    //用于存放创建了的棋子对象
    private static final Map<Integer, Chess> stringChessMap = new HashMap<>();

    //获得棋子 type:0黑1白
    public static Chess getChess(int type) {
        Chess chess = stringChessMap.get(type);
        if (chess == null) {
            Chess tmpChess = type == WHITE ? new WhiteChess() : new BlackChess();
            stringChessMap.put(type, tmpChess);
        }
        return stringChessMap.get(type);
    }
}



实际应用:jdk中Integer类。

本人的源码解析传送门: Integer类相关值比较&源码分析_最美是雨天的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值