享元设计模式(一) - 定义及使用

前言

享元设计模式系列文章
享元设计模式(一) - 定义及使用
享元设计模式(二) - 使用场景

1. 定义?


使共享对象可以有效的支持大量的细粒度的对象,核心其实就是对象复用

2. 举例说明


比如买火车票,只要我们输入起点、终点,就可以输出一张票;
思路如下:
1>:创建Ticket火车票类;
2>:创建获取火车票查询工厂,在这里需要做缓存:
a:首先定义一个 sTicketMap集合,用于存储获取的票;
b:在getTicket()方法中,首先根据key键获取对应Ticket的票,如果不为null,就直接返回ticket票;
c:如果根据key查询出的ticket为null,就new Tickets()对象,然后将其存储到sTicketMap集合就可以;

下一次再次调用 getTicket()方法,获取票时,就先从 sTicketMap集合中拿,如果集合没有,然后再去创建对象,这样就做到了享元设计模式,就是对象不会重复的去创建,而是重复的利用对象

3. 示例代码如下


1>:创建Ticket火车票:
/**
 * Email: 2185134304@qq.com
 * Created by Novate 2018/6/9 12:18
 * Version 1.0
 * Params:
 * Description:    火车票
*/

public class Ticket {
    String from ;  // 起点
    String to ;   // 终点

    public Ticket(String from  ,String to){
        this.from = from ;
        this.to = to ;
    }
    /**
     * 价格
     */
    int getPrice(){
        return new Random().nextInt(100) + 20 ;
    }
}
2>:创建火车票查询工厂:
/**
 * Email: 2185134304@qq.com
 * Created by Novate 2018/6/9 12:19
 * Version 1.0
 * Params:
 * Description:    火车票查询工厂
*/

public class TicketFactory {

    // 对票这个对象,做一个缓存
    static Map<String , Ticket> sTicketMap = new HashMap<>() ;

    /**
     * 获取票
     */
    public static Ticket getTicket(String from , String to){
        String key = from + "-" + to ;
        // 只要一调用获取票,首先根据key获取票
        Ticket ticket = sTicketMap.get(key) ;
        // 如果票不为null,就直接返回
        if (ticket != null){
            return ticket ;
        }

        // 如果票为空,创建ticket对象,然后把键值对存储到sTicketMap集合中即可
        ticket = new Ticket(from , to) ;
        sTicketMap.put(key , ticket) ;
        return ticket ;
    }
}
3>:创建测试类
/**
 * Email: 2185134304@qq.com
 * Created by Novate 2018/6/9 12:23
 * Version 1.0
 * Params:
 * Description:    享元设计模式测试类
*/

public class Client {
    public static void main(String[] args){
        for (int i = 0; i < 1000; i++) {
            Ticket ticket = TicketFactory.getTicket("北京" , "西安") ;
            
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,779评论 18 399
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,646评论 8 265
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,993评论 19 139
  • 一水 一荒漠 一叶 一汪洋 一木 崖上立 一人 心下藏 一刻时 你帮我 我放你于心 一放就是四年 四年间 我寻你 ...
    智小智锵锵锵锵阅读 199评论 0 0
  • 有一次,参加一个省里的办公室工作能力提升培训班。授课老师个个儿都是大拿,收获颇多。两年过去了,到现在,记得最清楚的...
    DUMANMAN阅读 893评论 0 0