享元模式的学习

Unity3D设计模式学习之享元模式 前言 享元模式Flyweight 用来解决大量且重复对象的管理问题。当内存受限的时候,使用享元模式来解决 大部分对象共享的问题。 GOF享元模式的定义为 使用共享的方式,让一群大小规模对象能更有效地运行。 共享 共享指的是使用管理结构来设计信息的存储方式,让可以被共享的信息,只需要产生一份对象,而这个对象能够被引用到其他对象中。 我们把哪些对象只能读取而不能写入的共享部分称为“... 阅读详情

展示网站项目

​  给客户A做了一个产品展示网站,客户A的朋友感觉效果不错,但是需求不同。==》有人希望以博客的形式,或者微信公众号的形式发布

 

传统方案

在这里插入图片描述

存在的问题:

  因为需要的网站结构相似度高,并且都不属于高访问量的项目,若分成多个虚拟空间处理,则相当于一个相同网站的实例对象被创建了很多,造成服务器的资源浪费。
 
 解决思路:整个到一个网站,共享相关的代码和数据。

 

享元模式

​  摒弃了在每个对象中保存所有数据的方式, 通过共享多个对象所共有的相同状态, 让你能在有限的内存容量中载入更多对象。运用共享技术有效地支持大量细粒度的对象。

​

​  常用于系统底层开发,解决系统的性能问题。像数据库连接池,里面都是已创建的连接对象。而我们需要直接调用即可,避免重新创建。

​

 享元模式能够解决重复对象的内存浪费的问题,当系统中有大量相似对象,需要缓冲池时。不需总是创建新对象,可以从缓冲池里拿。这样可以降低系统内存,同时提高效率。

 享元模式经典的应用场景就是池技术了,String常量池、数据库连接池、缓冲池等等都是享元模式的应用 ,享元模式是池技术的重要实现方式。

享元模式只是一种优化。 在应用该模式之前, 你要确定程序中存在与大量类似对象同时占用内存相关的内存消耗问题, 并且确保该问题无法使用其他更好的方式来解决。

享元模式结构

在这里插入图片描述

 1.享元 (Flyweight)类包含原始对象中部分能在多个对象中共享的状态。 同一享元对象可在许多不同情景中使用。 享元中存储的状态被称为 “内在状态”。 传递给享元方法的状态被称为 “外在状态”

 2.情景(Context)类包含原始对象中各不相同的外在状态。情景与享元对象组成在一起就能表示原始对象的全部状态

 通常情况下,原始对象的行为会保留到享元类中。因此调用享元方法需要提供外在状态作参数。但也可将行为放置在情景类中,将享元作为单纯的数据对象。

 3.享元工厂(Flyweight Factory)会对已有享元的缓存池进行管理。有了工厂后客户端就无需直接创建享元,它们只需调用工厂并向其传递目标享元的一些内在状态即可。工厂会根据参数在之前已创建的享元中进行查找,如果找到满足条件的享元就将其返回如果没有找到就根据参数新建享元。

 4.客户端(Client)必须存储和计算外在状态(情景)的数值, 因为只有这样才能调用享元对象的方法。为了使用方便,外在状态和引用享元的成员变量可以移动到单独的情景类中。

 

享元模式适合应用场景

 仅在程序必须支持大量对象且没有足够的内存容量时使用享元模式。

 

实现方式

 1. 将需要改写为享元的类成员变量拆分为两个部分:
   内在状态: 包含不变的、 可在许多对象中重复使用的数据的成员变量。
   外在状态: 包含每个对象各自不同的情景数据的成员变量

 2. 保留类中表示内在状态的成员变量, 并将其属性设置为不可修改。 这些变量仅可在构造函数中获得初始数值。

 3. 找到所有使用外在状态成员变量的方法, 为在方法中所用的每个成员变量新建一个参数, 并使用该参数代替成员变量。

 4. 你可以有选择地创建工厂类来管理享元缓存池, 它负责在新建享元时检查已有的享元。 如果选择使用工厂, 客户端就只能通过工厂来请求享元, 它们需要将享元的内在状态作为参数传递给工厂。

 5. 客户端必须存储和计算外在状态 (情景) 的数值, 因为只有这样才能调用享元对象的方法。 为了使用方便, 外在状态和引用享元的成员变量可以移动到单独的情景类中。

 

享元模式优缺点

​  优点:

  ✔️ 如果程序中有很多相似对象, 那么你将可以节省大量内存。

 缺点:

  ❌ 你可能需要牺牲执行速度来换取内存, 因为他人每次调用享元方法时都需要重新计算部分情景数据。

   ❌代码会变得更加复杂。 团队中的新成员总是会问: “为什么要像这样拆分一个实体的状态?”。

 

更改后的项目

在这里插入图片描述

代码:

public class User {
    private String name;

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

    public String getName() {
        return name;
    }
}
public abstract class WebSite {
    public abstract void use(User user);
}

public class ConcreteWebSite extends WebSite {

    //共享部分(内部状态)
    private String type=""; //网站发布的类型

    public ConcreteWebSite(String type){
        this.type = type;
    }

    public void use(User user){
        System.out.println("使用者为"+user.getName()+" 发布的类型是:"+type);
    }
}


//网站工厂类,根据需要返回一个网站
public class WebSiteFactory {


    //集合,充当 池 的作用
    private HashMap<String,ConcreteWebSite> pool = new HashMap<>();

    //根据类型,返回一个网站。若没有,则创建并放入池中
    public WebSite getWebSiteCategory(String type){
        if (!pool.containsKey(type)){
            pool.put(type,new ConcreteWebSite(type));
        }

        return pool.get(type);
    }

    public int getWebSiteCount(){
        return pool.size();
    }
}
public class Client {
    public static void main(String[] args) {
        WebSiteFactory factory = new WebSiteFactory();

        WebSite webSite_news = factory.getWebSiteCategory("新闻");
        webSite_news.use(new User("Tom"));

        WebSite webSite_blogs = factory.getWebSiteCategory("博客");
        webSite_blogs.use(new User("Jerry"));

        WebSite webSite_blogs1 = factory.getWebSiteCategory("博客");
        webSite_blogs1.use(new User("Marry"));

        System.out.println(factory.getWebSiteCount());
        System.out.println(webSite_blogs+" | "+webSite_blogs1); //地址一致
    }
}

 
 享元模式的注意事项和细节

  1.在享元模式这样理解,“ 享”就表示共享,“元”表示对象

  2.系统中有大量对象, 这些对象消耗大量内存,并且对象的状态大部分可以外部化时,我们就可以考虑选用享元模式

  3.用唯一标识码判断,如果在内存中有,则返回这个唯一标识码所标识的对象,用HashMap/HashTable存储

  4.享元模式大 大减少了对象的创建,降低了程序内存的占用,提高效率

  5.享元模式提高了系统的复杂度。需要分离出内部状态和外部状态,而外部状态具有固化特性,不应该随着内部状态的改变而改变,这是我们 使用享元模式需要注意的地方

  6.使用享元模式时,注意划分内部状态和外部状态 ,并且需要有 一个工厂类加以控制。

  7.享元模式经典的应用场景是需要缓冲池的场景,比如 String常量池、数据库连接池

Windows系统中 Xmanager 6 企业版下载安装激活教程 Xmanager 6 企业版安装激活教程 1.Xmanager 6 下载网址:https://yunpan.360.cn/surl_yrJrWq3GmjN 2. 双击 Xmanager-6.0.0169r 安装 3. 点击运行按钮 4. 点击下一步 5. 选择我接受许可证协议中的条款(A), 点击下一步。 6. 输入用户名:byg,公司名称:microsoft,序... 阅读详情

相关推荐

DeepMD-kit描述子机制解析:从原子坐标到不变性特征

本文深入解析DeepMD-kit描述子机制,详细阐述如何将原子坐标转换为具有平移、旋转和排列不变性的特征表示。探讨了se_e2_a、se_e3等不同描述子的适用场景及性能优化技巧,帮助读者掌握这一关键技术在分子模拟中的应用实践。

weixin_42520661的博客 340

设计模式学习系列十:享元模式(Flyweight Pattern)

暂时第一次听说,应该用的不多,暂时不学习这个了。

学习记录 1040

【Linux】常见指令的使用

Linux常用指令

qq_74897518的博客 1479

Java与模式学习笔记 —— 享元模式(Flyweight Pattern)

享元模式是对象的结构模式,以共享的方式高效地支持大量的细粒度对象。 共享的关键是区分内蕴状态和外蕴状态。 内蕴状态:存储在享元对象内部的,并且是不会随环境改变而有所不同的。一个享元可以具有内蕴状态并可以共享。 外蕴状态:随环境改变而改变、不可共享的状态。享元对象的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。 单纯享元模式的结构 在单纯享元模式中,所有的享元对象都是可以共享的。简单实现的结构如下图所示。 抽象享元(Flyweight)角色:此角色是所有的具体享元

通信侠的博客 238

硬件原理图:从软件思维到硬件接口的嵌入式开发破局指南

本文为软件开发者提供了读懂硬件原理图的嵌入式开发破局指南。文章将硬件原理图类比为“硬件系统的架构图”,引导读者将软件API调用思维迁移到硬件接口理解上,详细解析了电阻、电容、二极管等常见元器件的“硬件API”功能与选型逻辑,并通过实战电路拆解,阐述了从原理图分析到驱动代码编写的完整思维链条,帮助开发者建立软硬件协同的系统级视角。

lg888的博客 496

从CD4051到现代模拟开关:40年芯片演进史与选型避坑指南

本文回顾了从CD4051到现代模拟开关的40年技术演进,详细对比了导通电阻、带宽等关键参数的显著提升。通过实际案例和选型矩阵,揭示现代模拟开关在精度、功耗和集成度方面的优势,并提供高精度测量、电池供电等场景的选型策略与避坑指南,帮助工程师优化设计。

weixin_42543046的博客 153

进阶学习(3.7) Flyweight Pattern 享元模式

1, 前言 看完了设计模式发现, 设计模式是一种设计思想, 并不是某种规范, 要是让我去记设计模式的规范, 我是无法记住的, 也无法应用实际, 所以此后的设计模式, 都将注重思想理解, 学会举一反三, 好记性不如烂笔头, 虽然有些设计模式看一遍就会了, 但还是记个笔记好一点 2,什么是享元 拆开, 分享元数据, 元数据是啥玩意, 就是基础数据, 不变的数据, 给你是一块砖, 给我也是一块砖, 这里是通用想法, 但不一定是常量数据才能设计成享元模式, 对象也可以, 使用对象就更像原型模式了, 走clo.

BIG.KE的博客 181

BMS | 从一串到几百串硬件架构简介

锂电池在生活中越来越多的方面扮演能源的角色,除了大家熟知的电动汽车行业,在一些消费类,工业类电子产品比如手机,电动自行车,电动工具中都有应用,追本溯源今天我们一起来学习下最基础的BMS架构。 1~4串架构 以S8241为代表的无通信/无固件/模拟器件 可实现过充保护、过放保护、过流/短路,参数由器件后缀代码决定;通信类手持设备供电系统;1~4节电池保护板架构 如图使用S-8241系列保护IC,一对充放电MOS管控制充放电的回路的切断和接通,系统供电来自于电芯电压,VM引脚用于检测过...

ningvay的博客 9918

认真学习设计模式之享元模式(Flyweight Pattern)

# 【1】概述 ## ① 介绍 **享元模式(Flyweight Pattern) 也叫蝇量模式-- 运用共享技术有效地支持大量细粒度的对象**。常用于系统底层开发,解决系统的性能问题。像数据库连接池,里面都是创建好的连接对象,在这些连接对象中有我们需要的则直接拿来用,避免重新创建,如果没有我们需要的,则创建一个。 享元模式能够解决重复对象的内存浪费的问题,当系统中有大量相似对象,需要缓冲池时。不需总是创建新对象,可以从缓冲池里拿。这样可以降低系统内存,同时提高效率。 享元模式经典的应用场景就是池技术了

小小默:进无止境 1375

Linux SMP系统多核启动机制详解

对称多处理(SMP)是现代操作系统支持多核并行计算的基础架构。其核心原理是通过引导处理器(BSP)初始化系统环境后,通过处理器间中断(IPI)机制唤醒应用处理器(AP)。在x86架构中,AP启动时处于实模式,需要特殊的trampoline代码完成保护模式切换和分页设置。这种设计既保证了系统初始化的正确性,又实现了多核并行处理的性能优势。理解SMP启动流程对优化系统启动速度和调试多核问题至关重要,特别是在云计算和嵌入式系统中,高效的SMP初始化能显著提升系统响应能力。本文以Linux内核为例,深入解析了从BS

weixin_35006125的博客 290

【C语言笔记初级篇】第一章:C语言快速入门及注意事项

(1)第一个C语言程序 A:利用vs2010写C语言程序 1:按以下步骤新建工程 2:添加源文件,“.c”文件 B:第一个C语言代码 1:以下是基本的C语言程序 2:由于没有设置连接器,所以打印结果没有显示,按照如下步骤链接控制台 (2)数据类型 A:基本数据类型及占用字节 B:一些概念的梳理 概念一:关于计算机的单位 位(bit):计算机通过电路的开关和闭合处理信息,电路通...

快乐江湖的博客 3737

设计模式学习--15.享元模式(Flyweight Pattern)

package com.designepattern.flyweightpattern; /** * @Date:2020/12/2 * @Content: */ import java.util.HashMap; /*** * 享元模式 * */ public class MainDemo { public static void main(String[] args) { FlyWeightFactory ff=new FlyWeight...

u010031813的博客 176

[SoC]SoC验证中bootcode与firmware相关验证经验总结

本文总结了SoC验证中bootcode和firmware的验证经验。重点介绍了两种数据加载方法:1)使用Verilog系统函数$readmemh/$readmemb直接写入ROM/ARAM,需注意文件路径、格式和斜杠方向;2)通过Memory Hierarchy在initial块中操作,需要添加适当延时并注意路径拼接。文章还提供了在testcase phase中先读取数据到HASH再写入SRAM的示例,并强调加载后需使能edc_bypass以避免ECC错误。验证过程中需特别注意文件位置、格式要求及路径处理等

元直的博客 2498

《游戏编程模式》学习笔记(三)享元模式 Flyweight Pattern

为了减少需要推送到GPU的数据量,我们想把共享的数据——TreeModel——只发送一次。然后,我们分别发送每个树独特的数据——位置,颜色,大小。第一部分是一块需要渲染多次的共同数据——在例子中是树的网格和纹理。我们只需要一个TreeModel实例化的对象就好了,剩下的树只需要保存一个TreeModel的指针,就可以很快的找到这个对象。这就是享元模式,实际上我认为享元模式没有什么好说的东西,所以这里的大部分内容我都是直接照搬原著的。在系统设计中,对象实例进行分类后,发现真正有区别的分类很少的时候。

Currybeefer的博客 761

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

深度学习工具包 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")

设计模式学习—享元模式(Flyweight Design Pattern)

设计模式之享元模式的学习

闲鱼的博客 519

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

尚硅谷设计模式学习(12)---[享元模式(Flyweight Pattern)]

尚硅谷传送门==>B站尚硅谷Java设计模式 ❤❤❤感谢尚硅谷❤❤❤ 最近开始计划学习一下设计模式了,加油!!! 目录情景引入享元模式 情景引入 小型的外包项目,给客户A做一个产品展示网站,客户A的朋友感觉效果不错,也希 望做这样的产品展示网站,但是要求都有些不同: 有客户要求以新闻的形式发布 有客户人要求以博客的形式发布 有客户希望以微信公众号的形式发布 传统思路分析 按照传统思路,直接使用客户A的网站项目进行拷贝使用; 但是这些网站的基本结构大体相同,相当于是创建了多个实例对

从零开始的异世界JAVA学习 692

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

学习笔记【23种设计模式-第十一节:Flyweight Pattern 享元模式】

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

qq_53273362的博客 144

享元模式学习总结

目录 享元模式 引言 定义 模式类图 实例 实例描述 实例类图 实现代码 模式扩展 单纯享元模式 复合享元模式 总结 模式优点 模式缺点 享元模式 引言 当系统中存在大量相同或相似的对象时,享元模式是一种较好的解决方案,它通过共享技术实现相同或相似的细粒度对象的复用,从而节约了内存空间。 定义 英文定义:"Use the sharing to suppo...

江川的博客 916

HeadFirst 设计模式学习笔记16--享元模式拾零

本文已搬家至【HeadFirst 设计模式学习笔记】15 享元模式拾零

gnuhpc的专栏 3900

设计模式学习(十二):享元模式

我们知道,只有使用过被丢弃的对象才是垃圾回收的目标,所以,我们需要想办法在处理大量请求的同时,尽量少的产生这种一次性对象。最有效的方法就是,优化你的代码中处理请求的业务逻辑,尽量少的创建一次性对象,特别是占用内存较大的对象。不过,跟IntegerCache 不同的是,它并非事先创建好需要共享的对象,而是在程序的运行期间,根据需要来创建和缓存字符串常量。当我们使用自动装箱或者。在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。

Practitioner 328

设计模式学习笔记---享元模式FlyWeight pattern(Java版)

一、场景 内存属于稀缺资源,不要随便浪费。如果有很多个完全相同或相似的对象,我们可一通过享元模式,节省内存。 围棋软件设计 每个围棋棋子都是一个对象,有如下属性: 可以共享(内部状态): 颜色 形状 大小 不可以共享(外部状态): 位置 二、实质 享元模式以共享的方式高效地支持大量细粒度对象的重用。 享元对象能做到共享的关键是区分内部状态和外部状态。 内部状态:可以共享,

吃果冻不吐果冻皮 1338

七个结构型模式6: 享元模式-Flyweight Pattern【学习难度:★★★★☆,使用频率:★☆☆☆☆】

引入动机:当一个软件系统在运行时产生的对象数量太多,将导致运行代价过高,带来系统性能下降等问题。例如在一个文本字符串中存在很多重复的字符,如果每一个字符都用一个单独的对象来表示,将会占用较多的内存空间,那么我们如何去避免系统中出现大量相同或相似的对象,同时又不影响客户端程序通过面向对象的方式对这些对象进行操作?享元模式正为解决这一类问题而诞生。 享元模式(Flyweight Pattern):运

JackZhangNJU的专栏 411

DP学习——享元模式

学而时习之,温故而知新。

huibin.yun的博客 718

享元模式学习

可以极大减少内存中对象的数量,使得相同或相似对象在内存中只保存一份,从而可以节约系统资源,提高系统性能。享元模式的外部状态相对独立,而且不会影响其内部状态,从而使得享元对象可以在不同的环境中被共享。享元模式的主要缺点如下:享元模式使得系统变得复杂,需要分离出内部状态和外部状态,这使得程序的逻辑复杂化。为了使对象可以共享,享元模式需要将享元对象的部分状态外部化,而读取外部状态将使得运行时间变长。

Circ 512

java设计模式学习之【享元模式】

这篇教程不仅提供了享元模式的理论基础,还通过具体的Java代码示例展示了如何实现和应用这种模式。简单理解,通俗易懂

qq_33129875的博客 1741

学习设计模式《十九》——享元模式

 享元模式的本质是【分离与共享】

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1266
上一篇: 外观模式的学习
下一篇: 代理模式的学习
code_Floyed
博客等级 码龄7年 3粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值