设计模式-11享元模式

C++设计模式11:享元模式 享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享对象来减少内存使用和提高性能。在该模式中,我们将需要共享的对象(如字母、数字、图形等)抽象成一个对象接口,然后通过工厂类来维护这些对象的唯一实例,并在需要的时候进行共享,避免了重复创建大量的对象。享元模式的核心思想是将一个对象的状态分成内部状态和外部状态。内部状态是可以共享的,而外部状态则需要通过参数传递进来。对于相同的内部状态,享元模式只会创建一次实例,并在需要的时候进行共享,从而节约了内存空间。 阅读详情

享元模式

基本介绍:
  • 享元模式也叫蝇量模式,运用共享技术有效的支持大量细粒度的对象
  • 常用于系统底层开发,解决系统的性能问题,像数据库连接池,里面都是创建好的对象,在这些连接对象中有我们需要的则直接拿来用,避免重新创建,如果没有我们需要的,则重新创建一个
  • 享元模式能够解决重复对象的内存浪费的问题,当系统中有大量相似对象,需要缓冲池时,不需总是创建新对象,可以从缓存池里拿,这样可以降低系统内存,同时提高效率
  • 享元模式经典的应用场景就是池化技术,String常量池、数据库连接池、缓冲池等等都是享元模式的应用,享元模式是池化技术的重要实现方式
主要角色说明:

在这里插入图片描述

  • Flyweight:是抽象的享元角色,他是产品的抽象类,同时定义出对象的内部状态和外部状态的接口或实现
  • ConreteFlyweight :是具体的享元角色,是具体的产品类,实现抽象角色定义相关业务
  • UnSharedConreteFlyweight:是不可能共享的角色,一般不会出现在享元工厂
  • FlyweightFactory:享元工厂类,用于构建一个池化容器(集合),同时提供从池中获取对象方法
  • 内部状态和外部状态:
  1. 享元模式提出了两个要求:细粒度和共享对象。这里涉及到内部状态和外部状态了,即把对象的信息分为俩个部分:内部状态和外部状态
  2. 内部状态:对象共享出来的信息,存储在享元对象内部且不会随环境的变化而变化
  3. 外部状态:对象得以依赖的一个标记,是随环境改变而改变的、不可共享的状态
案例:

根据不同的需要创建不同类型的网站
在这里插入图片描述

/**
 * 外部状态类
 */
public class User {
    private String name;

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
//抽象类
public abstract class WebSite {
    abstract void use(User user);
}

public class ConcreteWebSite extends WebSite {

    //内部状态
    private String type;

    public ConcreteWebSite(String type) {
        this.type = type;
    }
    //user为外部状态
    public void use(User user) {
        System.out.println(type + "网站正在使用中" + "使用者" + user.getName());
    }
}

/**
 * 缓存池类,生产webSite
 */
public class WebSiteFactory {

    private Map<String,WebSite> pool = new HashMap<>();

    public WebSite getWebSite(String type){
        if(!pool.containsKey(type)){
            pool.put(type,new ConcreteWebSite(type));
        }
        return pool.get(type);
    }

    public int webSiteCount(){
        return pool.size();
    }

}

public class Client {

    public static void main(String[] args) {
        WebSiteFactory factory = new WebSiteFactory();

        WebSite webSite1 = factory.getWebSite("新浪");
        User tom = new User("Tom");
        webSite1.use(tom);

        User jack = new User("jack");
        WebSite webSite2 = factory.getWebSite("博客");
        webSite2.use(jack);

        User lisi = new User("lisi");
        WebSite webSite3 = factory.getWebSite("博客");
        webSite3.use(lisi);

        User zhangsan = new User("zhangsan");
        WebSite webSite4 = factory.getWebSite("博客");
        webSite4.use(zhangsan);

        System.out.println("pool size is " + factory.webSiteCount());
    }
}
享元模式在JDK中的使用:

Integer类就使用到了享元模式

public class Example {

    public static void main(String[] args) {
        //-128 --127如果存在直接从缓存中获取
        Integer x = Integer.valueOf(127);
        Integer y = new Integer(127);

        Integer z = Integer.valueOf(127);
        Integer w = new Integer(127);

        System.out.println(x.equals(y)); //true
        System.out.println(x == y);      //false
        System.out.println(x == z);      //true
        System.out.println(w == x);      //false
        System.out.println(w == y);      //false
    }
}
享元模式的注意事项和细节:
  • 在享元模式这样理解,“享”就是表示共享,“元”表示对象
  • 系统中有大量对象,这些对象消耗大量内存,并且对象的状态大部分可以外部化时,我们就可以考虑选用享元模式
  • 用唯一标识码判断,如果内存中有,则返回这个唯一标识码所标识的对象,用hashmap或hashtable存储
  • 享元模式大大减少了对象的创建,降低了程序内存的占用,提高效率
  • 享元模式提高了系统的复杂度,需要分离出内部状态和外部状态,而内部状态具有固化特性,不应该随着外部状态的变化而变化,这是我们使用享元模式需要注意的
  • 使用享元模式时,注意划分内部状态和外部状态,并且需要有一个工厂类加以控制
  • 享元模式经典使用场景是需要缓冲的场景,比如string常量池、数据库连接池
VS2019编译配置Easy3D 阅读详情

相关推荐

VUE3 实战手记(一)集成 EasyUI for Vue 组件库

本文详细介绍了如何在VUE3项目中集成EasyUI for Vue组件库,包括环境准备、基础安装、配置与集成、TypeScript类型问题解决以及组件实战等内容。EasyUI以其轻量级和开箱即用的特性,特别适合快速开发后台管理系统,提升开发效率。

weixin_30628801的博客 528

【C#设计模式】11.享元模式(Flyweight Pattern)【结构型】

1.1 动机(Motivate) 在软件系统中,采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价——主要指内存需求方面的代价。如何在避免大量细粒度对象问题的同时,让外部客户程序仍然能够透明地使用面向对象的方式来进行操作? 1.2 意图(Intent) 运用共享技术有效地支持大量细粒度的对象。       ——《设计模式》GoF ............

星Yeah 的博客 2111

基于QEMU的openEuler aarch64虚拟机快速部署与漏洞验证指南

本文提供了一份基于QEMU在个人电脑上快速部署openEuler aarch64虚拟机的详细指南。内容涵盖从软件准备、目录规划、QEMU安装、虚拟磁盘创建到系统安装与SSH配置的全过程,并以CVE-2024-1086内核漏洞为例,演示了如何在该虚拟环境中进行安全漏洞的验证与补丁测试,为安全研究和运维测试提供了一个低成本、高效率的ARM架构沙箱环境。

earth的博客 438

设计模式精讲 Day 11:享元模式(Flyweight Pattern)

享元模式是一种结构型设计模式,它通过共享对象来减少内存使用,提高系统性能。将对象中可以共享的部分提取出来,作为共享对象;而无法共享的部分则作为外部状态,由客户端进行维护。该模式适用于对象数量庞大且具有高度相似性的场景,特别适合用于图形界面、文本编辑器、游戏引擎等需要频繁创建和销毁对象的系统中。本篇详细介绍了享元模式的核心思想、实现方式、适用场景以及实际应用案例。我们通过Java代码展示了如何构建一个完整的享元模式系统,并分析了其在文本编辑器等场景中的价值。

在未来等你的专栏 1102

VS2022下OSG+OSGEARTH开发环境一键配置指南(Win10 x64+CMake自动化构建)

本文详细介绍了在VS2022环境下配置OSG和OSGEARTH开发环境的完整指南,包括软件下载、CMake自动化构建、编译实战及环境验证。通过一键配置脚本和常见问题解决方案,帮助开发者快速搭建3D开发环境,提升开发效率。

weixin_28828243的博客 405

CST实战:5分钟搞定圆极化天线轴比分析(含远场设置技巧)

本文提供了一份CST Studio Suite圆极化天线轴比分析的实战指南。文章详细讲解了轴比的概念与工程标准,并重点演示了如何正确设置远场监视器以获取Axial Ratio数据,包括关键步骤与后处理技巧。最后,通过植入式天线在生物组织环境中的案例,分析了复杂环境对轴比性能的影响及优化思路。

nokia的博客 992

设计模式-11_2享元模式 (Flyweight Pattern) 源码实例大全

享元模式通过共享对象减少内存消耗,Hibernate实体缓存是其典型应用。该模式包含享元接口(EntityRegionAccessStrategy)、具体享元(EntityRegionImpl)和享元工厂(EntityRegionAccessStrategyFactory)三个核心组件。Hibernate通过EntityRegion缓存实体对象,实现对象复用,其中ReadOnlyEntityRegionAccessStrategy等策略类处理不同访问方式。这种设计有效减少了重复对象的创建,提高了系统性能,尤

d3y1`5 81_09 1138

AutoSAR系列讲解(入门篇)2.2-SWC的类型

该章讲解了两种SWC的分类,并且映射到实际的工程中应该是具体的什么文件类型

雪云飞星的博客 4万+

二十三种设计模式[11] - 享元模式(Flyweight Pattern)

摘要 享元模式,对象结构型模式的一种。在《设计模式 - 可复用的面向对象软件》一书中将之描述为“ 运用共享技术有效地支持大量细粒度的对象 ”。 在享元模式中,通过工厂方法去统一管理一个对象的创建,在创建对象前会尝试复用工厂类中缓存的已创建对象,如果未找到可重用的对象则创建新的对象实例并将其缓存。以此来减少对象的数量达到减少内存开销的目的。 在学习享元...

weixin_30436891的博客 160

【YOLOv11】070、YOLOv11异常检测:正常数据训练下的异常目标识别

本文探讨了如何利用YOLOv11模型进行工业异常检测,重点介绍了仅使用正常样本训练模型的创新方法。文章首先通过产线误报案例引出异常检测的核心问题,阐述了YOLOv11作为特征提取器的改造思路,包括正常数据训练、特征空间构建和异常度量等关键步骤。实战部分提供了精简代码示例,强调数据增强控制、特征层选择和自编码器应用等技巧。作者还总结了容易出错的细节,如特征选择、阈值设定和计算效率优化等,并给出实用建议:从简单方法入手、重视可视化、确保数据质量、部署时设置复核机制等。最后指出该方法虽能减少对异常样本的依赖,但需

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 235

【ArcGIS微课1000例】0068:ArcGIS加载world imagery高清卫星影像教程

本文介绍了如何在ArcGIS中加载World Imagery高清卫星影像作为谷歌影像的替代方案。通过添加ArcGIS Server并输入在线图集URL(https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer),即可连接并预览包含中国影像、青海湖、东方明珠等全球高清卫星图。该教程提供了详细的操作步骤图示,帮助用户快速获取优质底图数据,适用于地理信息分析和可视化应用。

智慧空间实验室 5414

设计模式-11_1享元模式 (Flyweight Pattern) 源码实例大全

享元模式通过共享相似对象来减少内存消耗,提升系统性能。Spring框架中典型应用包括:1) 字符串池(String.intern())实现字符串共享;2) Integer缓存池(-128~127)复用常用数字对象;3) Bean元数据(BeanMetadataAttribute)共享配置信息。这些实现通过内部缓存机制,在频繁创建相似对象时显著降低资源开销,如字符串比较时直接使用==判断引用而非内容,Integer.valueOf()优先返回缓存实例。该模式特别适用于存在大量细粒度重复对象的场景。

d3y1`5 81_09 416

5.1 rocr-runtime libhsakmt event 机制全景—从 Doorbell 到 Signal

本文介绍了ROCm/KFD中的Event机制架构,主要解决GPU异步计算中的反馈问题。Event机制分为三层:硬件层触发事件,内核层管理事件通知,用户态接收处理。事件类型分为三大类:同步类事件(如SIGNAL、QUEUE_EVENT)用于任务完成通知,异常类事件(如MEMORY、HW_EXCEPTION)报告错误,拓扑类事件(如NODECHANGE)处理设备变更。该机制通过共享内存和中断实现高效通信,避免CPU轮询开销。后续文章将深入内核实现、Thunk层封装和多队列完成检测实战。

图形/计算GPU的驱动与虚拟化技术分享园地 1295

【设计模式11】享元模式

享元模式是一种通过共享技术减少内存消耗的设计模式,适用于存在大量相似对象的场景。其核心思想是将对象状态分为内部状态(可共享)和外部状态(不可共享),相同的内部状态只存储一份。本文以电商秒杀系统为例,展示了如何使用享元模式优化商品对象管理:创建商品享元对象、定义可共享的内部状态和不可共享的外部状态,并通过享元工厂管理共享对象池。该模式特别适合游戏粒子效果、文档编辑器字符格式等需要对象复用的场景,能有效降低内存占用,提升系统性能。代码示例演示了如何实现商品享元模式的关键组件。

专注后端技术架构,AI技术分享 1023

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

设计模式 11 享元模式

享元模式的核心思想是将对象的状态分为内部状态(可以共享的部分)和外部状态(不能共享的部分)。通过共享相同的内部状态,减少内存的重复占用,从而实现系统的资源优化。

Winemonk 876

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

23种设计模式(11)_结构型_享元模式(Flyweight Pattern)

享元模式——运用共享技术有效地支持大量细粒度的对象。享元模式可以避免大量相似类的开销,在软件开发中如果需要生成大量细粒度的类实例来表示数据,如果这些实例除了几个参数外基本上都是相同的,这时候就可以使用享元模式来大幅度减少需要实例化类的数量。如果能把这些参数(指的这些类实例不同的参数)移动类实例外面,在方法调用时将他们传递进来,这样就可以通过共享大幅度地减少单个实例的数目。优点:降低了系统中对象的数量,从而降低了系统中细粒度对象给内存带来的压力。缺点:为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑

heyuchang666的专栏 748

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Java设计模式11——享元模式

一、适用场景  内存属于稀缺资源,不能随意浪费。如果在一个系统中有很多个完全相同或相似的对象,我们就可以使用享元模式,让他们共享一份内存即可,不必每个都去实例化对象,从而节省内存空间。二、模式核心 享元模式以共享的方式高效的支持大量细粒度对象的重用。 享元对象能做到共享的关键是区分了内部状态和外部状态。 内部状态:可以共享,不会随环境改变而改变。 外部状态:不可以共享,会随环境改变而改变。 围棋例

小小本科生成长之路 2万+

JavaScript 23 种设计模式之 11 享元模式

享元模式是一种性能优化方案,其核心是利用共享技术有效支持大量类似的颗粒度对象,从而尽可能减少对象的创建,节省内存空间。

杏子 370

设计模式11 - 享元模式

作者:billy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 享元模式 使用场景 优缺点 注意事项 UML结构图 代码实现 ...

billy的博客 308

11、设计模式之享元模式

定义 运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。拆解定义:享-共享,元-元数据。 结构 享元(Flyweight)模式中存在以下两种状态: 内部状态:不会随着环境的改变而改变的可共享部分 外部状态:随环境改变而改变的不可共享的部分。享元模式的实现要领就是区分应用中的这两种状态,并将外部状态外部化。 享元(Flyweight)模式中存在以下几种角色: 抽象享元角色(Flyweight):通常是一

pp_hu的博客 191

【设计模式】11.享元模式

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

橙子的博客 255

设计模式(11)——享元模式

目录传统方案解决网站展现项目享元模式内部状态和外部状态享元模式解决网站展现项目享元模式在JDK-Integer的应用源码分析享元模式的注意事项和细节 案例说明:展示网站项目需求 小型的外包项目,给客户A做一个产品展示网站,客户A的朋友感觉效果不错,也希望做这样的产品展示网站,但是要求都有些不同: 1)有客户要求以新闻的形式发布 2)有客户要求以博客的形式发布 3)有客户要求以微信公众号的形式...

minge0001的博客 253

【Java开发】设计模式 11:享元模式

享元模式的主要思想是共享可共享的对象,避免创建大量重复的对象,从而减少内存的使用。通过维护一个对象池,可以快速获取对象,也可以在不需要对象时及时释放对象。📌如果需要频繁地创建和销毁大量对象,可以使用对象池来复用已经存在的对象,避免重复创建和销毁的性能损耗。比如 Java 中的字符串 String,其中同样字符的 String 指向同一个对象,不用字符的 String 指向不同的对象,字符拼接后相等字符的 String 也指向相同的对象。对于一些需要频繁读取的资源,可以使用享元模式来共享资源,提高性能效率。

尹煜的博客 569

设计模式11享元模式

享元模式(FlyWeight) 场景: 内存属于稀缺资源,不要随便浪费。如果有很多个完全相同或相似的对象,我们可以通过享元模式,节省内存。 核心: 享元模式以共享的方式高效地支持大量细粒度对象的重用。 享元对象能做到共享的关键是区分了内部状态和外部状态。 内部状态:可以共享,不会随环境变化而改变 外部状态:不可以共享,会随环境变化而改变 可以作为参数传进来 案例 享元模式实现: Flywe...

AthlenaA的博客 196

设计模式——享元模式11

享元模式

qq_45178641的博客 492

设计模式——11. 享元模式

享元模式(Flyweight Pattern)是一种结构型设计模式,它旨在减少系统中相似对象的内存占用或计算开销,通过共享相同的对象来达到节省资源的目的。

374
上一篇: 设计模式-12代理模式
下一篇: 设计模式-13模板模式
胖柯G
博客等级 码龄10年 453粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值