zoukankan      html  css  js  c++  java
  • 【设计模式】享元模式

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

    参考的优秀的文章:

    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;
        }
    
        @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<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
  • 相关阅读:
    resin网站出错!
    Java的编译与执行
    对SDK、JDK、JRE和JVM的理解总结
    第一个JDBC实例 操作MYSQL数据库
    三种定义JavaScript函数方法以及使用匿名函数打造自己的类库
    JavaScript 闭包原理和闭包实现
    学习Java运算符时的取余(%)和自加减(++、)的小结
    chmod 命令用法
    Eclipse快捷键大全
    ||运算符在JavaScript的另类用法
  • 原文地址:https://www.cnblogs.com/nick-huang/p/5050667.html
Copyright © 2011-2022 走看看