时长:1h12min
学习目标:
》掌握享元模式与组合模式的应用场景
》 了解享元模式的内部状态和外部状态
》掌握组合模式的透明写法和安全写法
》享元模式和组合模式的优缺点
定义:
Flyweight Pattern,享元模式。又称轻量级模式,是对象池的一种实现,类似于线程池,线程池可以避免不停
地创建和销毁多个对象,消耗性能。通过减少对象数量从而改善应用所需的对象结构的方式。
宗旨:
共享细粒度对象,将多个对同一对象的访问集中起来。来达到资源的重复利用。
属于结构型模式。
享元模式在生产中的体现:
房产中介:各类房源共享,全国社保联网。
常常应用于系统底层的开发,以便解决系统性能问题。
系统有大量相似对象,需要缓冲池的场景。
一般需要传入外部状态。
package com.wf.flyweight.general; /** * @ClassName IFlyweight * @Description 享元角色,顶层接口 * @Author wf * @Date 2020/5/25 10:07 * @Version 1.0 */ public interface IFlyweight { void operation(String extrinsicState); }
package com.wf.flyweight.general; /** * @ClassName ConcreteFlyweight * @Description 享元实现,因为该类实例需要反复使用,所以,使用工厂类来创建实例 * @Author wf * @Date 2020/5/25 10:10 * @Version 1.0 */ public class ConcreteFlyweight implements IFlyweight { private String intrinsicState; public ConcreteFlyweight(String intrinsicState) { this.intrinsicState = intrinsicState; } @Override public void operation(String extrinsicState) { System.out.println("Object address:"+System.identityHashCode(this)); System.out.println("IntrinsicState:"+this.intrinsicState); System.out.println("ExtrinsicState:"+extrinsicState); } }
package com.wf.flyweight.general; import java.util.HashMap; import java.util.Map; /** * @ClassName FlyweightFactory * @Description 享元工厂,因为需要把实例添加到缓存,会创建容器 * @Author wf * @Date 2020/5/25 10:16 * @Version 1.0 */ public class FlyweightFactory { private static Map<String,IFlyweight> pool = new HashMap<String,IFlyweight>(); //因为内部状态具备不变性,因此,作为缓存key public static IFlyweight getFlyweight(String intrinsicState){ if(!pool.containsKey(intrinsicState)){ IFlyweight flyweight = new ConcreteFlyweight(intrinsicState); pool.put(intrinsicState, flyweight); } return pool.get(intrinsicState); } }
注意:
享元对象是多例的
在外地工作的同学,每年过春节回家,为了购买火车票,都需要提前一个月进行抢票。如果人工抢票,一般官方放票一两小时,
车票就会抢光了,这时出现很多刷票软件。
刷新软件的实现原理:
会定时检查12306的余票数量【通过sdk或爬虫】,一旦发现有余票,就会把它放到共享池里面,就可以让大家一起来抢票了。
在抢票之前,需要先缓存抢票人的个人信息,出发站,目的地,如果要求匹配,就立马下单,就不需要重复填写信息。就能加快抢票
速度,提高效率。
下面用代码来模拟抢票的过程。
原文:https://www.cnblogs.com/wfdespace/p/12957670.html