【设计模式】享元模式
上周代码评审,看到同事使用了“享元模式”。想起自己也不懂,着手学习之。
参考的优秀的文章:
Java的享元模式
这篇博文为学习之理解、感悟,如理解不真确,请慷慨指出。
本文只讨论单纯享元模式。
Flyweight,是享元模式的意思。同时,其亦是最轻量级摔跤手、轻量级的意思。我想应该是“最轻量级摔跤手 > 轻量级 > 享元模式”慢慢拓展的吧。
将相同的对象共享、缓存,有以下好处,一、避免重复创建相同的对象,二、避免相同的对象存放在内存以消耗内存。
但是,这么做的可行性有一个大前提,就是该对象的不可以改变的:比如A、B两个线程(或代码)都共享C对象,而在B线程工作中,如果可以变更C对象,而C对象在A线程的设计中是不应该如此变更的,这样,不就发生冲突了吗?
最简单的代码实现:
package com.nicchagil.study;public interface Flyweight {}
View Code
package com.nicchagil.study;public class User implements Flyweight {private String id;public User(String id) {super();this.id = id;}public String getId() {return id;}@Overridepublic String toString() {StringBuilder builder = new StringBuilder();builder.append("User [id=").append(id).append("]");return builder.toString();}/* 注意,不应该有此方法,及类似的可改变对象内容的逻辑,因为不允许对象的内容发生变更 *//*public void setId(String id) {this.id = id;}*/}
View Code
package com.nicchagil.study;import java.util.HashMap; import java.util.Map;public class UserFlyweightFactory {private static Map<String, Flyweight> flyweights = new HashMap<String, Flyweight>();public static Flyweight getInstance(String key) {/* 简易写法 */synchronized (flyweights) {if (flyweights.get(key) == null) {flyweights.put(key, new User(key));}}/* 双重判断写法 *//*if (flyweights.get(key) == null) {synchronized (flyweights) {if (flyweights.get(key) == null) {flyweights.put(key, new User(key));}}}*/return flyweights.get(key);}}
View Code
package com.nicchagil.study;public class HowToUse {public static void main(String[] args) {Flyweight flyweight1 = UserFlyweightFactory.getInstance("1");Flyweight flyweight2 = UserFlyweightFactory.getInstance("2");Flyweight flyweight3 = UserFlyweightFactory.getInstance("1");System.out.println("flyweight1 == flyweight2 -> " + (flyweight1 == flyweight2));System.out.println("flyweight1 == flyweight3 -> " + (flyweight1 == flyweight3));}}
View Code
【设计模式】享元模式相关推荐
- Python设计模式-享元模式
Python设计模式-享元模式 基于Python3.5.2,代码如下 #coding:utf-8class Coffee:name = ""price = 0def __init_ ...
- 10-Python与设计模式--享元模式
10-Python与设计模式--享元模式 一.网上咖啡选购平台 假设有一个网上咖啡选购平台,客户可以在该平台上下订单订购咖啡,平台会根据用户位置进行线下配送.假设其咖啡对象构造如下: class Co ...
- 设计模式--享元模式实现C++
/********************************* *设计模式--享元模式实现 *C++语言 *Author:WangYong *Blog:http://www.cnblogs.co ...
- 【设计模式】Java设计模式 - 享元模式
[设计模式]Java设计模式 - 享元模式
- Unity设计模式——享元模式(附代码)
Unity设计模式--享元模式(附源码) 享元Flyweight模式是什么 享元模式是一种结构型设计模式, 它摒弃了在每个对象中保存所有数据的方式, 通过共享多个对象所共有的相同状态, 让你能在有限的 ...
- 第二十二章 Caché 设计模式 享元模式
文章目录 第二十二章 Caché 设计模式 享元模式 定义 优点 使用场景 结构图 描述 完整示例 实体类 抽象享元角色 实现享元角色 享元工厂 调用 思考 第二十二章 Caché 设计模式 享元模式 ...
- JavaScript设计模式-享元模式
JavaScript设计模式-享元模式 概念 例子 内部状态与外部状态 享元模式的通用结构 例子 总结 github仓库地址:点击 [设计模式例子](https://github.com/fanhua ...
- JAVA 设计模式 享元模式
用途 享元模式 (Flyweight) 运用共享技术有效地支持大量细粒度的对象. 享元模式是一种结构型模式. 结构 图-享元模式结构图 Flyweight : 它是所有具体享元类的超类或接口,通过这个 ...
- java设计模式---享元模式
Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己 对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广 泛,遵循一定的编程模式,才能使自己的 ...
- PHP设计模式——享元模式
声明:本系列博客参考资料<大话设计模式>,作者程杰. 享元模式使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件:它适合用于只是因重复而导致使用无法令人接受的大量内存的 ...
最新文章
- java Random.nextInt()方法
- SAP IDOC开发
- JVM 类加载机制深入浅出
- python逻辑回归代码_Logistic 逻辑回归及 python 实现
- hdu 1251 统计难题 (Trie树)
- 架构师日记|一次性讲透K8S,服务网格,服务治理这些概念
- Filecoin Gas基础费率降至4.67 nanoFIL
- 构建ai数据库_为使用AI的所有人构建更安全的互联网
- mmap库:Python内存映射文件操作
- 如何用手机制作电子版证件照?
- 《单域名下整合动网、动易、OBlog程序》
- 波士顿大学 计算机专业,波士顿大学计算机工程类专业排名还是该小心的看
- 我国学生被美深泉学院录取 每周20小时放牛种草
- Warning: Accessing non-existent property ‘cd‘ of module exports inside circular dependency
- 《Python数据分析与挖掘》实战项目 - Python程序设计(期末大作业、课程设计、毕业设计)2012-2021近十年考研英语一真题词汇词频统计与可视化(附代码)
- 超级电视与海信电视争第一,这是一场胜负已定的战争
- CTFshow_命令执行
- java多线程---重入锁ReentrantLock
- iframe标签中写html代码,Iframe嵌套HTML网页的用法?
- 不怕别人比你聪明,不怕别人比你努力,就怕比你聪明的人比你还努力!