zoukankan      html  css  js  c++  java
  • Flyweight 享元模式

     

     

    注:享元模式是结构型设计模式,避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类).

     

    很多细粒度对象,只用部分状态不同,大部分是相同的。为了减少内存开销,我们可以利用享元模式,通过一个对象来代替多个对象,实现需求。

     

    享元模式中有个很经典的例子,字母的享元使用。

     

    Java简单代码实现

    字母类

     

    package com.pattern.structure.flyweight;
    
     
    
    public class Letter {
    
     
    
    private String color ;
    
     
    
    private String name ;
    
     
    
    public String getColor() {
    
    return color;
    
    }
    
     
    
    public void setColor(String color) {
    
    this.color = color;
    
    }
    
     
    
    public String getName() {
    
    return name;
    
    }
    
     
    
    public void setName(String name) {
    
    this.name = name;
    
    }
    
     
    
    public void display() {
    
    System.out.println(color + "  " + name);
    
    }
    
    }

     

     

    字母工厂类

     

    package com.pattern.structure.flyweight;
    
     
    
    import java.util.HashMap;
    
    import java.util.Map;
    
     
    
     
    
    public class LetterFactory {
    
     
    
    private static Map<String, Letter> letterMap = new HashMap<>() ;
    
     
    
    public static Letter getRedLetter(String letterName) {
    
     
    
    Letter letter = getLetter(letterName) ;
    
    letter.setColor("red");
    
     
    
    return letter ;
    
    }
    
     
    
    public static Letter getBlackLetter(String letterName) {
    
     
    
    Letter letter = getLetter(letterName) ;
    
    letter.setColor("black");
    
     
    
    return letter ;
    
    }
    
     
    
    public static Letter getLetter(String letterName) {
    
     
    
    Letter letter = null ;
    
    if(letterMap.containsKey(letterName) ) {
    
    letter = letterMap.get(letterName) ;
    
    } else {
    
    letter = new Letter() ;
    
    letter.setName(letterName); 
    
    letterMap.put(letterName, letter) ;
    
    }
    
     
    
    return letter ;
    
    }
    
     
    
    public static int getObjectSize() {
    
     
    
    return letterMap.size() ;
    
    }
    
    }

     

     

    客户端类

     

    package com.pattern.structure.flyweight;
    
     
    
    public class Client {
    
     
    
     
    
    public static void main(String[] args) {
    
     
    
    Letter aRed = LetterFactory.getRedLetter("a") ;
    
    aRed.display(); 
    
     
    
    Letter bRed = LetterFactory.getRedLetter("b") ;
    
    bRed.display(); 
    
     
    
    Letter aBlack = LetterFactory.getBlackLetter("a") ;
    
    aBlack.display(); 
    
     
    
    Letter bBlack = LetterFactory.getBlackLetter("b") ;
    
    bBlack.display(); 
    
     
    
    System.out.println("object size: " + LetterFactory.getObjectSize());
    
    }
    
    }

     

     

     

    运行客户端程序可以看出,我们使用了4个对象,实际只创建了两个对象,如果颜色多种,效果更明显。

     

     

    享元模式通用类图

     

     

     

     

     

    ------

      文章只为技术交流学习,若所写有误,请斧正,评论或消息与我,为不误导后来学习的人;若有不小心所写侵权,请告知我;若转载,请注明出处。

     

     

     

     

  • 相关阅读:
    一些你可能用到的代码
    iOS 键盘下去的方法
    iOS设计模式汇总
    随笔
    Spring cloud config 分布式配置中心 (三) 总结
    Spring cloud config 分布式配置中心(二) 客户端
    Spring cloud config 分布式配置中心(一) 服务端
    jdbcUrl is required with driverClassName spring boot 2.0版本
    JpaRepository接口找不到 spring boot 项目
    解决IntelliJ “Initialization failed for 'https://start.spring.io'
  • 原文地址:https://www.cnblogs.com/sten/p/3353258.html
Copyright © 2011-2022 走看看