• GoF23种设计模式之结构型模式之享元模式


    一、概述 

            运用共享技术有效地支持大量细粒度的对象。

    二、适用性

    1.当一个应用程序使用了大量的对象的时候。

    2.由于使用大量的独享而造成很大的存储开销的时候。

    3.对象的大多数状态都可变为外部状态的时候。

    4.如果删除对象的外部状态,那么可以用相对较少的共享独享取代很对组对象的时候。

    5.应用程序不依赖于对象标识的时候。由于享元模式对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。

    三、参与者

    1.Flyweight:描述一个接口,通过这个接口Flyweight可以接受和作用于对象外部状态。

    2.ConcreteFlyweight:实现Flyweight接口,并为内部状态(如果有)增加存储空间。

    3.UnsharedConcreteFlyweight:并非所有的Flyweight子类都需要被共享。Flyweight接口使共享成为可能,但并不强制共享。在Flyweight对象结构的某些层次上,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点。

    4.FlyweightFactory:创建并管理Flyweight对象。确保合理地共享Flyweight对象。当用户请求一个Flyweight对象时,FlyweightFactory提供一个已经创建好的的实例或者创建一个新的实例给它。

    四、类图

    五、示例

    Flyweight

    [java] view plain copy
     
     print?
    1. package cn.lynn.flyweight;  
    2.   
    3. public interface IPerson {  
    4.       
    5.     public void say(int num);  
    6.   
    7. }  

    ConcreteFlyweight

    [java] view plain copy
     
     print?
    1. package cn.lynn.flyweight;  
    2.   
    3. public class PersonImpl implements IPerson {  
    4.   
    5.     @Override  
    6.     public void say(int num) {  
    7.         System.out.println("报数:" + num);  
    8.     }  
    9.   
    10. }  

    FlyweightFactory

    [java] view plain copy
     
     print?
    1. package cn.lynn.flyweight;  
    2.   
    3. import java.util.HashMap;  
    4. import java.util.Map;  
    5.   
    6. public class PersonCache {  
    7.   
    8.     private static Map<String, PersonImpl> personPool = new HashMap<String, PersonImpl>();  
    9.       
    10.     public PersonCache(String key) {  
    11.         personPool.put(key, new PersonImpl());  
    12.     }  
    13.       
    14.     public static IPerson getPerson(String key) {  
    15.         if(personPool.get(key) == null) {  
    16.             personPool.put(key, new PersonImpl());  
    17.         }  
    18.         return personPool.get(key);  
    19.     }  
    20.     public static int getSize() {  
    21.         return personPool.size();  
    22.     }  
    23. }  

    Client

    [java] view plain copy
     
     print?
    1. package cn.lynn.flyweight;  
    2.   
    3. public class Client {  
    4.   
    5.     public static void main(String[] args) {  
    6.         IPerson p1 = PersonCache.getPerson("张三");  
    7.         p1.say(1);  
    8.           
    9.         IPerson p2 = PersonCache.getPerson("张三");  
    10.         System.out.println("p1和p2是同一个人吗?" + ((p1 == p2) ? "是" : "不是"));  
    11.           
    12.         IPerson p3 = PersonCache.getPerson("李四");  
    13.         p3.say(2);  
    14.           
    15.         IPerson p4 = PersonCache.getPerson("王五");  
    16.         p4.say(3);  
    17.           
    18.         IPerson p5 = PersonCache.getPerson("赵六");  
    19.         p5.say(4);  
    20.           
    21.         System.out.println("现有人数:" + PersonCache.getSize());  
    22.     }  
    23.   
    24. }  

    Result

    [java] view plain copy
     
     print?
      1. 报数:1  
      2. p1和p2是同一个人吗?是  
      3. 报数:2  
      4. 报数:3  
      5. 报数:4  
      6. 现有人数:4  
  • 相关阅读:
    LuoguP2765 魔术球问题
    LuoguP1402 酒店之王
    luoguP4313 文理分科
    玲珑杯 1138
    codeforces 822 D. My pretty girl Noora(dp+素数筛)
    codeforces 822 C. Hacker, pack your bags!(思维+dp)
    51nod 1376 最长递增子序列的数量(不是dp哦,线段树 +  思维)
    hdu4565 So Easy!(矩阵快速幂)
    atcode E
    atcoder D
  • 原文地址:https://www.cnblogs.com/huangwentian/p/7471508.html
Copyright © 2020-2023  润新知