前言
享元设计模式系列文章
享元设计模式(一) - 定义及使用
享元设计模式(二) - 使用场景
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("北京" , "西安") ;
}
}
}