揭秘设计模式之享元模式

Posted 醉酒的小男人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了揭秘设计模式之享元模式相关的知识,希望对你有一定的参考价值。

什么是享元模式

享元模式在日常生活中也比较常见比如:房产中介房源共享、全国统一社保联网、身份证实名联网、各种第三方抢票软件通过缓存用户信息,不停的去12306官网去查询是否有票,他们都有缓存共享的概念,比如身份证、社保联网可以防止重复办理,浪费资源,节省大量钱财。

享元模式定义

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。比如:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。其实可以理解为缓存,比如使用HashMap,key相同是取value值,不同的时候添加到HashMap。

内部状态和外部状态

代码案例

这个案例和注册式单例比较相似。

其中:

  1. ITicket就是抽象享元角色
  2. TrainTicket就是具体享元角色
  3. TicketFactory就是享元工厂
package com;
public interface ITicket {
    void showInfo(String bunk);
}
package com;

import java.util.Random;

public class TrainTicket implements ITicket{

    private String from;
    private String to;
    private int price;

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

    @Override
    public void showInfo(String bunk) {
        this.price = new Random().nextInt(500);
        System.out.println(String.format("%s->%s: %s 价格: %s 元",this.from,this.to,bunk,this.price));

    }
}
package com;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class TicketFactory {

    //缓存也是享元的一种
    private static Map<String,ITicket> pool = new ConcurrentHashMap<>();

    public static ITicket queryTicket(String from,String to){
        String key = from +"->"+to;
        if(pool.containsKey(key)){
            System.out.println("使用缓存的key:"+key);
            return pool.get(key);
        }
        System.out.println("第一次查询创建对象:"+key);
        ITicket iTicket = new TrainTicket(from,to);
        pool.put(key,iTicket);
       return iTicket;
    }
}
package com;

public class App 
{
    public static void main( String[] args )
    {
        ITicket ticket = TicketFactory.queryTicket("北京","上海");
        ticket.showInfo("软卧");

        ticket = TicketFactory.queryTicket("北京","上海");
        ticket.showInfo("软卧");
    }
}

结果:

以上是关于揭秘设计模式之享元模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之享元模式 FlyWeight

学习设计模式之享元模式

设计模式之享元模式

JAVA设计模式之享元模式(flyweight)

JAVA设计模式之享元模式(flyweight)

设计模式之享元模式