Java-23个设计模式 Flyweight 享元模式

本文介绍如何利用享元模式减少内存消耗。通过实例演示了当大量相似对象造成内存压力时,如何通过共享对象来降低内存使用。包括定义发送消息接口、创建实现该接口的手机对象以及构建对象池的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Flyweight 

主要解决面向对象的代价问题,一般不触及面向对象的抽象性问题。Flyweight采用对象共享的做法来降低系统中对象的个数,从而降低细粒度对象给系统带来的内存压力。

如本例中:用户通过不同品牌的手机发送短信,要求每个品牌只创建一次,当下次有人还要用创建过的对象发信息时,从对象池中拿。

① 创建一个发信息的接口(可供手机实现)

/**
 * 发送消息的接口
 */
public interface Message {
    void sendMessage();
}

② 创建手机对象,实现发短信的接口

/**
 * 手机实现发送消息的接口
 */
public class Phone implements Message {
    // 手机牌子
    private String brand;
    // 传入品牌获取手机
    public Phone(String brand) {
        this.brand = brand;
    }
    @Override
    public void sendMessage() {
        System.out.println("使用"+brand+"手机发送了一条信息");
    }
}

③ 创建对象池(通过手机的品牌来确认对象池中是否有对象)

/**
 * 对象池,手机工厂
 * 如果手机牌子已经存在,返回存在池中的手机
 * 如果手机牌子不存在,创建新的手机放入池中
 */
public class PhoneFactory {
    // 对象池应该是只读的
    private final static Map<String,Phone> phoneMap = new HashMap();

    public Phone getPhone(String brand){
        // 存在,直接返回
        if(phoneMap.containsKey(brand)){
            return phoneMap.get(brand);
        }else {
            // 不存在,创建并放入池中
            Phone newPhone = new Phone(brand);
            phoneMap.put(brand,newPhone);
            return newPhone;
        }
    }
    // 测试时查询对象池有几种品牌的手机
    public int getSize(){
        return phoneMap.size();
    }
}

场景:对象的数量太大从而导致对象内存开销过大的情况(什么样数量才算大,需要具体评估)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值