享元模式

cwb123 2020-10-19 原文


享元模式

定义:运用共享技术来有效地支持大量细粒度对象的复用,它通过共享已经存在的对象来大幅减少需要创建的对象数量,避免大量相似类的开销,从而提高系统资源利用率

优点:相同的对象只要保存一份,降低了系统中对象的数量,从而降低了系统中细粒度对象给内存带来的压力

缺点

1,为了使对象可以共享,需要将一些不能共享的状态外部化,这将增加程序的复杂性

2,读取享元模式的外部状态会使得运行时间稍微变长。

享元模式中存在两种状态

1,内部状态:不会随着环境的改变而改变的可共享部分

2,外部状态:指随着环境改变而改变的不可共享的部分,享元模式的实现就是区分应用中额这两种状态。

模式的结构

享元模式的主要角色如下

1,抽象享元角色:是所有具体享元类的基类,为具体享元规范需要实现的公共接口,非享元的外部状态以参数的形式通过方法传入

2,具体享元角色:实现抽象享元角色中所规定的接口

3,非享元角色:是不可以共享的外部状态,它以参数的形式注入具体享元的相关方法中。

4,享元工厂角色:负责创建和管理享元角色,当客户对象请求一个享元对象时,享元工厂检查系统中是否存在符合要求的享元对象,如果存在则提供给客户;如果不存在的话,则创建一个新的享元对象。

模式结构图

 

 应用场景

1,系统中存在大量相同或相似的对象,这些对象耗费了大量的内存资源

2,大部分对象可以按照内部状态进行分组,且可将不同部分外部化,这样每一个组只需保存一个内部状态

3,由于享元模式需要额外维护一个保存享元的数据结构,所以应当在有足够多的享元实例时才值得使用享元模式

代码

package flyweight;
import java.util.HashMap;
public class FlyweightPattern
{
    public static void main(String[] args)
    {
        FlyweightFactory factory=new FlyweightFactory();
        Flyweight f01=factory.getFlyweight("a");
        Flyweight f02=factory.getFlyweight("a");
        Flyweight f03=factory.getFlyweight("a");
        Flyweight f11=factory.getFlyweight("b");
        Flyweight f12=factory.getFlyweight("b");       
        f01.operation(new UnsharedConcreteFlyweight("第1次调用a。"));       
        f02.operation(new UnsharedConcreteFlyweight("第2次调用a。"));       
        f03.operation(new UnsharedConcreteFlyweight("第3次调用a。"));       
        f11.operation(new UnsharedConcreteFlyweight("第1次调用b。"));       
        f12.operation(new UnsharedConcreteFlyweight("第2次调用b。"));
    }
}
//非享元角色
class UnsharedConcreteFlyweight
{
    private String info;
    UnsharedConcreteFlyweight(String info)
    {
        this.info=info;
    }
    public String getInfo()
    {
        return info;
    }
    public void setInfo(String info)
    {
        this.info=info;
    }
}
//抽象享元角色
interface Flyweight
{
    public void operation(UnsharedConcreteFlyweight state);
}
//具体享元角色
class ConcreteFlyweight implements Flyweight
{
    private String key;
    ConcreteFlyweight(String key)
    {
        this.key=key;
        System.out.println("具体享元"+key+"被创建!");
    }
    public void operation(UnsharedConcreteFlyweight outState)
    {
        System.out.print("具体享元"+key+"被调用,");
        System.out.println("非享元信息是:"+outState.getInfo());
    }
}
//享元工厂角色
class FlyweightFactory
{
    private HashMap<String, Flyweight> flyweights=new HashMap<String, Flyweight>();
    public Flyweight getFlyweight(String key)
    {
        Flyweight flyweight=(Flyweight)flyweights.get(key);
        if(flyweight!=null)
        {
            System.out.println("具体享元"+key+"已经存在,被成功获取!");
        }
        else
        {
            flyweight=new ConcreteFlyweight(key);
            flyweights.put(key, flyweight);
        }
        return flyweight;
    }
}
参考连接:http://c.biancheng.net/view/1371.html
发表于
2020-10-19 14:51 
随风写意 
阅读(0
评论(0
编辑 
收藏

 

版权声明:本文为cwb123原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/cwb123/p/13840244.html

享元模式的更多相关文章

  1. 用最简单的例子说明设计模式(三)之责任链、建造者、适配器、代理模式、享元模式

    责任链模式 一个请求有多个对象来处理,这些对象是一条链,但具体由哪个对象来处理,根据条件判断来确定,如果不能处 […]...

  2. Java进阶篇设计模式之七 —– 享元模式和代理模式

    前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式。本篇则来学习下结构型模式最后的两个模式, 享元模式 […]...

  3. 设计模式(十二)—— 享元模式

    模式简介 运用共享技术有效地支持大量细粒度地对象。 通常情况下,面向对象技术可以增强系统地灵活性及可扩展性,在 […]...

  4. Java设计模式之享元模式

    版权声明:本文出自汪磊的博客,转载请务必注明出处。 设计模式系列与数据结构算法系列为本人知识的梳理,大体上没有 […]...

  5. 《设计模式》观察、组合、享元模式

    1.8 观察者模式-Observer(重要) 定义观察者接口,可以有多个观察者实现该接口。观察者经常和责任链一 […]...

  6. 重学 Java 设计模式:实战享元模式「基于Redis秒杀,提供活动与库存信息查询场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!...

随机推荐

  1. ASP程序测试 – 软件下载园

    ASP程序测试 ASP程序测试内容...

  2. 同时启动多个tomcat的配置信息

    同时启动多个tomcat的配置信息 下面把该配置文件中各端口的含义说明下. <Server port=& […]...

  3. [react 基础篇]——React.createClass()方法同时创建多个组件类

    react 组件 React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样, […]...

  4. WPF-模拟动态更换logo的过程(2),如何把网上的图片下载到指定目录。

    上一步,我们已经获取了图片应该保存的地址。现在只需要传入URL把图片下载到指定目录。 从网上下载图片也有俩种方 […]...

  5. eclipse快捷键 – 大景少

    eclipse快捷键 Eclipse中辅助键和快捷键的使用 常用辅助键和快捷键概述 内容辅助键   alt+/ […]...

  6. could not apply changes. Fix broken packages first

      sudo dpkg --configure -a  ...

  7. 区块链开发(1)基本概念

    最近一直没更新博客了,一方面是在技术转型,游戏行业的不景气,不再将重心放在游戏开发了,一方面也是在积累与学习中 […]...

  8. 我与计算机

    那还是在中专的时候,我还记得我第一次打字时,手都不听使唤,打字速度特别特别慢。手在键盘上都不知道按哪个键,而且 […]...

展开目录

目录导航