首页 > 其他分享 >十六:享元模式:优化的力量

十六:享元模式:优化的力量

时间:2023-04-30 14:03:03浏览次数:37  
标签:享元 String 对象 十六 color 内存 优化 public

a. 深入了解享元模式

享元模式,一种优化性能和资源占用的设计模式。它通过共享相似对象,减少内存占用,提高系统性能。想象一下,你在图书馆借了一本书,发现正好有一本与其相同。为什么买两本一样的书呢?享元模式就像是图书馆,让大家共享资源,节省空间。

b. 动手实现:享元模式示例

假设我们有一个画图应用,需要绘制数千个形状,其中许多形状具有相似的颜色。我们可以使用享元模式来减少颜色对象的数量。 首先,创建一个颜色接口和一个具体的颜色实现类:

public interface Color {
    void fillColor();
}

public class ConcreteColor implements Color {
    private String color;

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

    @Override
    public void fillColor() {
        System.out.println("Filling color: " + color);
    }
}

接下来,创建一个颜色工厂,用于存储和共享颜色对象:

import java.util.HashMap;
import java.util.Map;

public class ColorFactory {
    private Map<String, Color> colorMap;

    public ColorFactory() {
        colorMap = new HashMap<>();
    }

    public Color getColor(String colorName) {
        Color color = colorMap.get(colorName);

        if (color == null) {
            color = new ConcreteColor(colorName);
            colorMap.put(colorName, color);
            System.out.println("Creating new color: " + colorName);
        }

        return color;
    }
}

最后,编写客户端代码来测试享元模式:

public class Main {
    public static void main(String[] args) {
        ColorFactory colorFactory = new ColorFactory();

        Color red = colorFactory.getColor("red");
        red.fillColor();

        Color blue = colorFactory.getColor("blue");
        blue.fillColor();

        Color red2 = colorFactory.getColor("red");
        red2.fillColor();
    }
}

在这个示例中,我们只创建了一个“红色”对象,而不是每次都创建一个新对象。这样可以节省内存资源。

c. 优缺点剖析:享元模式的影响

优点:

1、减少内存占用:通过共享相似对象,可以显著降低内存消耗。 2、提高性能:减少对象创建和垃圾回收的次数,提高系统性能。

缺点:

1、增加代码复杂性:需要额外的逻辑来实现对象共享,增加了代码的复杂性。 2、可能增加系统维护成本:共享对象可能导致线程安全问题,需要采取适当的措施来避免。

d. 享元模式在开源框架中的应用

享元模式在许多开源框架中得到了广泛应用。例如,在Java的String类中,享元模式被用于实现字符串的内部池化。这有助于减少字符串对象的创建,降低内存占用。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    // The value is used for character storage.
    private final char value[];

    // ...
}

当我们使用字面量创建字符串时,JVM会自动将其添加到字符串常量池中。如果在之后我们再次创建相同的字符串字面量,JVM会从常量池中返回已有的实例,而不是创建一个新对象。

String str1 = "hello";
String str2 = "hello";
System.out.println(str1 == str2); // 输出 true,因为 str1 和 str2 指向相同的字符串对象

同样,在Android开发中,享元模式也被广泛应用于减轻应用程序的内存负担。例如,在Android的BitmapFactory类中,可以使用inBitmap选项来重用旧的Bitmap对象,避免创建新的对象。

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inBitmap = oldBitmap; // 使用旧的 Bitmap 对象
Bitmap newBitmap = BitmapFactory.decodeFile(filePath, options);

通过这种方式,我们可以在不牺牲性能的情况下节省内存资源,提高应用程序的运行效率。 总结起来,享元模式是一种优化内存和性能的设计模式。它通过共享相似对象,降低内存占用,提高系统性能。虽然实现起来有一定的复杂性,但在需要处理大量相似对象时,享元模式无疑是一个非常有效的解决方案。

标签:享元,String,对象,十六,color,内存,优化,public
From: https://blog.51cto.com/u_13616584/6237855

相关文章

  • 【dp的二分优化】NO300 最长递增子序列
    【dp的二分优化】300.最长递增子序列给你一个整数数组nums,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组[0,3,1,6,2,2,7]的子序列。示例1:输入:nums=[10,9,2,5,3,7,101,18]......
  • Django框架——Q查询进阶、ORM查询优化、事务操作、字段类型、字段参数、Ajax、Conten
    Q查询进阶fromdjango.db.modelsimportQq_obj=Q()#1.产生q对象q_obj.connector='or'#默认多个条件的连接是and可以修改为orq_obj.children.append(('pk',1))#2.添加查询条件q_obj.children.append(('price__gt',2000))#支持添加多个res=models.Book.o......
  • 如何优化操作大数据量数据库(几十…
    聚集索引的重要性和如何选择聚集索引在上一节的标题中,笔者写的是:实现小数据量和海量数据的通用分页显示存储过程。这是因为在将本存储过程应用于“办公自动化”系统的实践中时,笔者发现这第三种存储过程在小数据量的情况下,有如下现象:1、分页速度一般维持在1秒和3秒之间。2、在......
  • 如何优化操作大数据量数据库(改善…
    改善SQL语句很多人不知道SQL语句在SQLSERVER中是如何执行的,他们担心自己所写的SQL语句会被SQLSERVER误解。比如:select*fromtable1wherename='zhangsan'andtID>10000和执行:select*fromtable1wheretID>10000andname='zhangsan'一些人不知道以上两条语句的......
  • 大话AI绘画技术原理与算法优化
    引子博主很长一段时间都没有发文,确实是在忙一些技术研究。如标题所示,本篇博文主要把近段时间的研究工作做一个review。看过各种相关技术的公关文章,林林总总,水分很多。也确实没有多少人能把一些技术细节用一些比较通俗的语言阐述清楚。故此,再一次冠以大话为题,对AI绘画主要是st......
  • Python之路【第十六篇】:Django【基础篇】
    原博客教材链接:https://www.cnblogs.com/wupeiqi/articles/5237704.html Python的WEB框架有Django、Tornado、Flask等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM、模型绑定、模板引擎、缓存、Session等诸多功能。 1.基本配置1.1创建django程......
  • Arcgis 与 Claygl 可视化 glsl 特效篇(三十六)
    我决定不从claygl基础来讲了直接整合arcgis与claygl可视化来讲关于整合clagyl有兴趣看我这篇文章arcgis与claygl引擎结合做地图可视化我整合一个类库后续不断更新中npmi@haibalai/gismap4-claygl初始化gismap4-claygl类库,view是arcgis的sceneView对象import{ClayglMa......
  • 大数据学习初级入门教程(十六) —— Hadoop 3.x 完全分布式集群的安装、启动和测试
    好久没用Hadoop集群了,参考以前写的《大数据学习初级入门教程(一)——Hadoop2.x完全分布式集群的安装、启动和测试_孟郎郎的博客》和《大数据学习初级入门教程(十二)——Hadoop2.x集群和Zookeeper3.x集群做集成_孟郎郎的博客-》,下载了目前官网最新的版本 hadoop-3.3.5再......
  • Arcgis 与 Claygl 可视化 glsl 特效篇(二十六)
    我决定不从claygl基础来讲了直接整合arcgis与claygl可视化来讲关于整合clagyl有兴趣看我这篇文章arcgis与claygl引擎结合做地图可视化我整合一个类库后续不断更新中npmi@haibalai/gismap4-claygl初始化gismap4-claygl类库,view是arcgis的sceneView对象import{ClayglMa......
  • 斜率优化
    重点讲讲斜率优化的套路。首先需要将式子化为\(y=kx+b\)的形式,其中\(y,x\)为一个关于变量\(j\)的式子,\(k\)为一个关于常量\(i,b\)的式子。然后根据\(x,k\)的单调性考虑是二分还是直接单调。注意如果求最小值是下凸包,最大值是上凸包(最小值是直线从下面往上靠,最大值反之......