揭秘设计模式之享元模式
Posted 醉酒的小男人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了揭秘设计模式之享元模式相关的知识,希望对你有一定的参考价值。
什么是享元模式
享元模式在日常生活中也比较常见比如:房产中介房源共享、全国统一社保联网、身份证实名联网、各种第三方抢票软件通过缓存用户信息,不停的去12306官网去查询是否有票,他们都有缓存共享的概念,比如身份证、社保联网可以防止重复办理,浪费资源,节省大量钱财。
享元模式定义
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。比如:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。其实可以理解为缓存,比如使用HashMap,key相同是取value值,不同的时候添加到HashMap。
内部状态和外部状态
代码案例
这个案例和注册式单例比较相似。
其中:
- ITicket就是抽象享元角色
- TrainTicket就是具体享元角色
- 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("软卧");
}
}
结果:
以上是关于揭秘设计模式之享元模式的主要内容,如果未能解决你的问题,请参考以下文章