博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【设计模式】享元模式
阅读量:6500 次
发布时间:2019-06-24

本文共 2213 字,大约阅读时间需要 7 分钟。

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

 

参考的优秀的文章:

 

这篇博文为学习之理解、感悟,如理解不真确,请慷慨指出。

本文只讨论单纯享元模式。

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;    }    @Override    public 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
flyweights = new HashMap
(); 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

 

转载地址:http://vcvyo.baihongyu.com/

你可能感兴趣的文章
MySQL 语句整理 2019-5-3
查看>>
html5新标签使用
查看>>
compass安装使用960 Grid System
查看>>
关于小数的精确运算
查看>>
20175203 2018-2019 实验五《网络编程与安全》
查看>>
Eureka服务注册中心
查看>>
轻松记账工程冲刺第二阶段10
查看>>
分离导航模块
查看>>
Lighttpd1.4.20源代码分析 笔记 状态机之错误处理和连接关闭
查看>>
php代码中使用换行及(\n或\r\n和br)的应用
查看>>
高考估分查分选志愿一键搞定_支付宝又操办了件人生大事
查看>>
HTML中的form表单有一个关键属性 enctype
查看>>
LeetCode-135-Candy
查看>>
制作RPM包
查看>>
beego数据输出
查看>>
DecimalFormat
查看>>
如何在同一系统里同时启动多个Tomcat
查看>>
Unix / 类 Unix shell 中有哪些很酷很冷门很少用很有用的命令?(转)
查看>>
java显示本地磁盘所有盘符,显示桌面路径
查看>>
对Cost (%CPU) 粗略的理解
查看>>