设计模式:享元模式

1.定义

它是对象池的一种实现。享元模式用来尽可能的减少内存的使用量。多用于存在大量重复对象的场景,或需要缓冲池的时候。用来缓存共享的对象。这样来避免内存溢出等。

举例

定义巴士车票

public interface Ticket {
    public void showTicketInfo(String type);
}

public class BusTicket implements Ticket{
    private static final String TAG = BusTicket.class.getSimpleName();
    String from;
    String to;
    int price;

    BusTicket(String from,String to) {
        this.from = from;
        this.to = to;
    }

    @Override
    public void showTicketInfo(String type) {
        price = new Random().nextInt(100);
        Log.d(TAG,from + "到" + to + "的" + type + "巴士票价位" + price);
    }
}

//加入不用享元模式直接调用

public class TicketFactory {
    public static Ticket getTicket(String from,String to) {
        return new BusTicket(from,to);
    }
}

Ticket ticket = TicketFactory.getTicket("weihai","beijing");
ticket.showTicketInfo("硬座");

看似没毛病,客户端这样调用查询就可以了。普通情况下这样确实没有问题,但当有大量客户同时查询的时候就可能会OOM了。因为我们会创建大量的相同对象,十分耗内存。当java的GC对这些对象回收的时候同样也属于资源浪费。这时候,该享元模式登场的时候了。我们只需要修改一下Factory。

public class TicketFactory {
    static Map<String,Ticket> sTicketMap = new ConcurrentHashMap<String,Ticket>();

    public static Ticket getTicket(String from,String to) {
        String key = from + "-" + to;
        if (sTicketMap.containsKey(key)) {
            return sTicketMap.get(key);
        } else {
            Ticket ticket = new BusTicket(from,to);
            sTicketMap.put(key,ticket);
            return ticket;
        }
    }
}

写在最后

享元模式实现起来还是比较简单。在需要大量重复对象的时候起到重要作用。也用作缓存池等场景。能够降低内存中对象的数量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值