作者:joewong9272038385813 | 来源:互联网 | 2023-10-12 08:31
1.7.设计模式07-享元模式与组合模式详解1.7.1.享元模式详解时长:1h12min学习目标:》掌握享元模式与组合模式的应用场景》 了解享元模式的内部状态和外部状态》掌握组合模
1.7.设计模式07-享元模式与组合模式详解
1.7.1.享元模式详解
时长:1h12min
学习目标:
》掌握享元模式与组合模式的应用场景
》 了解享元模式的内部状态和外部状态
》掌握组合模式的透明写法和安全写法
》享元模式和组合模式的优缺点
7.1.享元模式的基本定义
定义:
Flyweight Pattern,享元模式。又称轻量级模式,是对象池的一种实现,类似于线程池,线程池可以避免不停
地创建和销毁多个对象,消耗性能。通过减少对象数量从而改善应用所需的对象结构的方式。
宗旨:
共享细粒度对象,将多个对同一对象的访问集中起来。来达到资源的重复利用。
属于结构型模式。
享元模式在生产中的体现:
房产中介:各类房源共享,全国社保联网。
7.1.1.应用场景
常常应用于系统底层的开发,以便解决系统性能问题。
系统有大量相似对象,需要缓冲池的场景。
7.2.享元模式的code实现
7.2.1.通用写法
1.顶层享元接口定义
一般需要传入外部状态。
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);
}
2.定义具体的享元实现
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);
}
}
3.享元工厂
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 pool = new HashMap();
//因为内部状态具备不变性,因此,作为缓存key
public static IFlyweight getFlyweight(String intrinsicState){
if(!pool.containsKey(intrinsicState)){
IFlyweight flyweight = new ConcreteFlyweight(intrinsicState);
pool.put(intrinsicState, flyweight);
}
return pool.get(intrinsicState);
}
}
注意:
享元对象是多例的
4.系统类图
7.2.2.享元模式的实际使用
在外地工作的同学,每年过春节回家,为了购买火车票,都需要提前一个月进行抢票。如果人工抢票,一般官方放票一两小时,
车票就会抢光了,这时出现很多刷票软件。
刷新软件的实现原理:
会定时检查12306的余票数量【通过sdk或爬虫】,一旦发现有余票,就会把它放到共享池里面,就可以让大家一起来抢票了。
在抢票之前,需要先缓存抢票人的个人信息,出发站,目的地,如果要求匹配,就立马下单,就不需要重复填写信息。就能加快抢票
速度,提高效率。
下面用代码来模拟抢票的过程。