面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和
对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。享元模式正是为解决这
一类问题而诞生的。
享元模式(Flyweight Pattern)又称为轻量级模式,是对象池的一种实现。类似于线程池,线程池
可以避免不停的创建和销毁多个对象,消耗性能。提供了减少对象数量从而改善应用所需的对象结构的
方式。其宗旨是共享细粒度对象,将多个对同一对象的访问集中起来,不必为每个访问者创建一个单独
的对象,以此来降低内存的消耗,属于结构型模式。
原文:Use sharing to support large numbers of fine-grained objects efficiently.
解释:使用共享对象可有效地支持大量的细粒度的对象。
享元模式把一个对象的状态分成内部状态和外部状态,内部状态即是不变的,外部状态是变化的;然后通过共享不变的部分,达到减少对象数量并节约内存的目的。
享元模式模式的本质是缓存共享对象,降低内存消耗。
首先我们来看享元模式的通用UML类图:
从类图上看,享元模式有三个参与角色:
抽象享元角色(Flyweight):享元对象抽象基类或者接口,同时定义出对象的外部状态和内部状态
的接口或实现;
具体享元角色(ConcreteFlyweight):实现抽象角色定义的业务。该角色的内部状态处理应该与
环境无关,不能出现会有一个操作改变内部状态,同时修改了外部状态;
享元工厂(FlyweightFactory):负责管理享元对象池和创建享元对象。
package com.gupaoedu.vip.pattern.flyWeight;
import java.util.Random;
/**
* @Author dawn Date on 2020/3/11 16:16
*/
public class TrainTicket implements ITicket {
private String from;
private String to;
private Double price;
public TrainTicket(String from, String to) {
this.from = from;
this.to = to;
}
public void showInfo(String bunk) {
this.price=new Random().nextDouble()*500;
//System.out.println(String.format("%s->%s: %s价格: %s 元", this.from,this.to,bunk, this.price));
System.out.println(String.format("%s->%s:%s价格: %s 元", this.from, this.to, bunk, this.price));
}
}
package com.gupaoedu.vip.pattern.flyWeight;
/**
* @Author dawn
* Date on 2020/3/11 16:12
*/
public interface ITicket {
void showInfo(String bunk);
}
package com.gupaoedu.vip.pattern.flyWeight;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @Author dawn
* Date on 2020/3/11 16:21
*/
public class TicketFactory {
private static Map<String,ITicket> ticketPool =new ConcurrentHashMap<String,ITicket>();
public static ITicket queryTicket(String form,String to){
return new TrainTicket(form, to);
}
public static ITicket queryTicketCase(String form,String to){
String key=form+"->"+to;
if(!ticketPool.containsKey(key)){
ITicket iTicket=new TrainTicket(form,to);
ticketPool.put(key,iTicket);
System.out.println("首次创建对象");
return iTicket;
}
System.out.println("使用缓存对象");
return ticketPool.get(key);
}
}
package com.gupaoedu.vip.pattern.flyWeight;
/**
* @Author dawn
* Date on 2020/3/11 16:22
* 享元模式demo
*/
public class FlyWeightTest {
public static void main(String[] args) {
// ITicket iTicket=TicketFactory.queryTicket("厦门北", "长汀南");
// iTicket.showInfo("二等座");
ITicket iTicket=TicketFactory.queryTicketCase("厦门北", "长汀南");
iTicket.showInfo("二等座");
iTicket=TicketFactory.queryTicketCase("厦门北", "长汀南");
iTicket.showInfo("一等座");
iTicket=TicketFactory.queryTicketCase("厦门北", "南昌南");
iTicket.showInfo("一等座");
}
}

来源:CSDN
作者:??g?h?j
链接:https://blog.csdn.net/weixin_40470962/article/details/104801666