首页 > 其他 > 详细

设计模式07-享元模式与组合模式详解

时间:2020-05-25 17:11:11      阅读:48      评论:0      收藏:0      [点我收藏+]

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<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);
    }
}

 

注意:

  享元对象是多例的

4.系统类图

技术分享图片

 

7.2.2.享元模式的实际使用

  在外地工作的同学,每年过春节回家,为了购买火车票,都需要提前一个月进行抢票。如果人工抢票,一般官方放票一两小时,

车票就会抢光了,这时出现很多刷票软件

刷新软件的实现原理:

  会定时检查12306的余票数量【通过sdk或爬虫】,一旦发现有余票,就会把它放到共享池里面,就可以让大家一起来抢票了。

  在抢票之前,需要先缓存抢票人的个人信息,出发站,目的地,如果要求匹配,就立马下单,就不需要重复填写信息。就能加快抢票

速度,提高效率。

 

  下面用代码来模拟抢票的过程。

 

设计模式07-享元模式与组合模式详解

原文:https://www.cnblogs.com/wfdespace/p/12957670.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!