上周代码评审,看到同事使用了“享元模式”。想起自己也不懂,着手学习之。

参考的优秀的文章:

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

【设计模式】享元模式相关推荐

  1. Python设计模式-享元模式

    Python设计模式-享元模式 基于Python3.5.2,代码如下 #coding:utf-8class Coffee:name = ""price = 0def __init_ ...

  2. 10-Python与设计模式--享元模式

    10-Python与设计模式--享元模式 一.网上咖啡选购平台 假设有一个网上咖啡选购平台,客户可以在该平台上下订单订购咖啡,平台会根据用户位置进行线下配送.假设其咖啡对象构造如下: class Co ...

  3. 设计模式--享元模式实现C++

    /********************************* *设计模式--享元模式实现 *C++语言 *Author:WangYong *Blog:http://www.cnblogs.co ...

  4. 【设计模式】Java设计模式 - 享元模式

    [设计模式]Java设计模式 - 享元模式

  5. Unity设计模式——享元模式(附代码)

    Unity设计模式--享元模式(附源码) 享元Flyweight模式是什么 享元模式是一种结构型设计模式, 它摒弃了在每个对象中保存所有数据的方式, 通过共享多个对象所共有的相同状态, 让你能在有限的 ...

  6. 第二十二章 Caché 设计模式 享元模式

    文章目录 第二十二章 Caché 设计模式 享元模式 定义 优点 使用场景 结构图 描述 完整示例 实体类 抽象享元角色 实现享元角色 享元工厂 调用 思考 第二十二章 Caché 设计模式 享元模式 ...

  7. JavaScript设计模式-享元模式

    JavaScript设计模式-享元模式 概念 例子 内部状态与外部状态 享元模式的通用结构 例子 总结 github仓库地址:点击 [设计模式例子](https://github.com/fanhua ...

  8. JAVA 设计模式 享元模式

    用途 享元模式 (Flyweight) 运用共享技术有效地支持大量细粒度的对象. 享元模式是一种结构型模式. 结构 图-享元模式结构图 Flyweight : 它是所有具体享元类的超类或接口,通过这个 ...

  9. java设计模式---享元模式

    Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己 对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广 泛,遵循一定的编程模式,才能使自己的 ...

  10. PHP设计模式——享元模式

    声明:本系列博客参考资料<大话设计模式>,作者程杰. 享元模式使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件:它适合用于只是因重复而导致使用无法令人接受的大量内存的 ...

最新文章

  1. java Random.nextInt()方法
  2. SAP IDOC开发
  3. JVM 类加载机制深入浅出
  4. python逻辑回归代码_Logistic 逻辑回归及 python 实现
  5. hdu 1251 统计难题 (Trie树)
  6. 架构师日记|一次性讲透K8S,服务网格,服务治理这些概念
  7. Filecoin Gas基础费率降至4.67 nanoFIL
  8. 构建ai数据库_为使用AI的所有人构建更安全的互联网
  9. mmap库:Python内存映射文件操作
  10. 如何用手机制作电子版证件照?
  11. 《单域名下整合动网、动易、OBlog程序》
  12. 波士顿大学 计算机专业,波士顿大学计算机工程类专业排名还是该小心的看
  13. 我国学生被美深泉学院录取 每周20小时放牛种草
  14. Warning: Accessing non-existent property ‘cd‘ of module exports inside circular dependency
  15. 《Python数据分析与挖掘》实战项目 - Python程序设计(期末大作业、课程设计、毕业设计)2012-2021近十年考研英语一真题词汇词频统计与可视化(附代码)
  16. 超级电视与海信电视争第一,这是一场胜负已定的战争
  17. CTFshow_命令执行
  18. java多线程---重入锁ReentrantLock
  19. iframe标签中写html代码,Iframe嵌套HTML网页的用法?
  20. 不怕别人比你聪明,不怕别人比你努力,就怕比你聪明的人比你还努力!

热门文章

  1. sql server面试题
  2. 如何使得按确定和取消按纽转到两个不同的页面!
  3. MFC按钮添加提示文字
  4. vc picture控件载入背景图,随控件大小改变
  5. Windows下获取视频设备的一种改进实现
  6. cifar数据集介绍及到图像转换的实现
  7. 【C++】重载、重写、隐藏
  8. 加班到凌晨三点,就能月薪五万了吗?
  9. linux内核异常分析ecp,内核基于嵌入式Linux的PocketIX系统
  10. php $this self,php中self与$this的区别