结构型模式-享元模式

2023-09-13 23:09:04

主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。

享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式。由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 Circle 对象。

意图:运用共享技术有效地支持大量细粒度的对象。

主要解决:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。

何时使用: 1、系统中有大量对象。 2、这些对象消耗大量内存。 3、这些对象的状态大部分可以外部化。 4、这些对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来时,每一组对象都可以用一个对象来代替。 5、系统不依赖于这些对象身份,这些对象是不可分辨的。

如何解决:用唯一标识码判断,如果在内存中有,则返回这个唯一标识码所标识的对象。

关键代码:用 HashMap 存储这些对象。

应用实例: 1、JAVA 中的 String,如果有则返回,如果没有则创建一个字符串保存在字符串缓存池里面。 2、数据库的连接池。

优点:大大减少对象的创建,降低系统的内存,使效率提高。

缺点:提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。

使用场景: 1、系统有大量相似对象。 2、需要缓冲池的场景。

注意事项: 1、注意划分外部状态和内部状态,否则可能会引起线程安全问题。 2、这些类必须有一个工厂对象加以控制。

public interface Shape {
    void draw();
}
@Data
public class Circle implements Shape {
    private String color;
    private int x;
    private int y;
    private int radius;


    public Circle(String color){
        this.color = color;
    }

    @Override
    public void draw() {
        System.out.println("this is Circle.draw");
        System.out.println("x="+x+"----y="+y+"----radius="+radius);
    }
}
public class ShapeFactory {
    private static final HashMap<String, Object> circleMap = new HashMap<>();

    public static Object getCircle(String color){
        Circle circle = (Circle) circleMap.get(color);
        if (BeanUtil.isEmpty(circle)){
            circle = new Circle(color);
            circleMap.put(color, circle);
            System.out.println("Creating circle of color : " + color);
        }
        return circle;
    }
}
    private static final String colors[] =
            { "Red", "Green", "Blue", "White", "Black" };

    @Test
    public void test7(){
        for(int i=0; i < 5; ++i) {
            Circle circle =
                    (Circle) ShapeFactory.getCircle(getRandomColor());
            circle.setX(getRandomX());
            circle.setY(getRandomY());
            circle.setRadius(100);
            circle.draw();
        }
    }

    private static String getRandomColor() {
        return colors[(int)(Math.random()*colors.length)];
    }
    private static int getRandomX() {
        return (int)(Math.random()*100 );
    }
    private static int getRandomY() {
        return (int)(Math.random()*100);
    }
/*

Creating circle of color : Green
this is Circle.draw
x=28----y=49----radius=100
Creating circle of color : Blue
this is Circle.draw
x=79----y=8----radius=100
Creating circle of color : White
this is Circle.draw
x=77----y=12----radius=100
this is Circle.draw
x=16----y=57----radius=100
this is Circle.draw
x=66----y=16----radius=100


*/

更多推荐

睿趣科技:抖音开一家网店大概什么时候回本

随着移动互联网的迅猛发展,社交媒体平台如抖音成为了商家推广产品和服务的热门渠道之一。许多人都希望能够通过在抖音上宣传自己的产品,甚至考虑开一家网店,但回本的时间是一个关键问题。本文将探讨抖音开一家网店大概什么时候回本的问题。首先,回本时间的长短与多种因素有关,包括产品的类型、市场竞争、推广策略等。一般来说,如果你的产品

性能测试之压力测试

文章目录一.基本介绍二.性能指标三.下载安装JMeter1.下载安装包2.启动JMeter四.使用JMeter1.模拟用户请求2.填写测试地址3.接收测试结果4.结果解释一.基本介绍压力测试考察当前软硬件条件下系统所能承受的最大负荷并找到系统瓶颈所在。压测是为了系统在线上的处理能力和稳定性维持在一个范围内。压力测试可以

Mysql——压缩包方式安装教程

一.Mysql压缩包下载方式zip版(5.7及8.0)的下载需到官方网站下载,不同版本对应能安装在不同的操作系统下,本次介绍的是mysql-8.0.30-winx64在win10下的安装方式。下载网址:MySQL::DownloadMySQLCommunityServer二.Mysql的安装流程1.下载压缩包至本机目录

DBAPI插件开发指南

DBAPI插件开发指南插件市场您可以去插件市场下载插件插件的作用DBAPI的插件分4类,分别是数据转换插件、缓存插件、告警插件、全局数据转化插件缓存插件对执行器结果进行缓存,比如SQL执行器,对查询类SQL,sql查询结果进行缓存,这样避免频繁的查询数据库,对数据库造成压力。缓存逻辑由用户自己编写,用户可以缓存到red

【linux基础(七)】Linux中的开发工具(下)--make/makefile和git

💓博主CSDN主页:杭电码农-NEO💓⏩专栏分类:Linux从入门到开通⏪🚚代码仓库:NEO的学习日记🚚🌹关注我🫵带你学更多操作系统知识🔝🔝Linux中的开发工具1.前言2.make和makefile介绍3.make和makefile再理解4.伪目标的定义以及性质5.文件的三个属性6.makefile推

Mac 电脑查看本地maven,及私有仓库的搭建与使用【nexus的配置与使用】

查看本地maven查看状态如果要查看本地maven,使用命令行:mvnhelp:effective-settings如下如localRepository标签nexus下载官网地址解压后如下图启动服务器/停止服务器bin目录下执行命令:./nexusstart如下图表面启动成功此时浏览器访问:http://localho

DevExpress WinForms图表组件 - 直观的数据信息呈现新方式!(一)

凭借界面控件DevExpressWinForms全面的2D和3D图表类型的集合,DevExpressWinForms的图表控件设计大大简化了开发者直观地向最终用户呈现信息的方式。DevExpressWinForms有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。同时能完美构建流畅、

MR混合现实情景实训教学

MR混合现实技术是一种将虚拟现实与现实场景相融合的创新技术,可以广泛应用于各个领域。其中,混合现实情景实训教学是MR技术的一个重要应用场景。在医学专业方面,医学生常常需要通过实际操作来提升自己的技能水平,然而传统的实训方式存在着一些问题,如实际设备的限制和真实情况的局限性。采用MR混合现实情景实训教学,学生可以通过佩戴

Stream流编程

目录获取流Stream流的常用方法:count.filter方法:forEach方法limit方法map方法skip方法concat方法收集Stream流流格式Stream<T>filter(Predicate<?superT>predicate);----->参数:publicinterfacePredicate<T

【Apollo】开启Apollo之旅:让自动驾驶如此简单

前言Apollo是百度公司推出的自动驾驶平台。它是一个综合性的自动驾驶解决方案,提供了包括感知、决策、规划和控制等核心功能,以及地图、定位、仿真、数据管理等配套工具。文章目录前言Apollo的发展历程Apollo8.0新特性软件包管理感知框架工具链小结云端体验软件包安装总结活动活动介绍学习形式课程安排活动奖励报名方式A

Docker部署单点Elasticsearch与Kibana

一、创建网络因为需要部署kibana容器,因此需要让es和kibana容器互联。这里创建一个网络:dockernetworkcreatees-net#创建一个网络名称为:es-net二、拉取并加载镜像方式一dockerpullelasticsearch:7.12.1版本为elasticsearch的7.12.1版本的镜

热文推荐