• java设计模式--结构型模式--享元模式


                                            享元模式
     概述
        运用共享技术有效地支持大量细粒度的对象。
        
        
     适用性
        当都具备下列情况时,使用Flyweight模式:
    
        1.一个应用程序使用了大量的对象。
    
        2.完全由于使用大量的对象,造成很大的存储开销。
    
        3.对象的大多数状态都可变为外部状态。
    
        4.如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
    
        5.应用程序不依赖于对象标识。由于Flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。
    
    
     参与者
        1.Flyweight
          描述一个接口,通过这个接口flyweight可以接受并作用于外部状态。
    
        2.ConcreteFlyweight
          实现Flyweight接口,并为内部状态(如果有的话)增加存储空间。
          ConcreteFlyweight对象必须是可共享的。它所存储的状态必须是内部的;即,它必须独立于ConcreteFlyweight对象的场景。
    
        3.UnsharedConcreteFlyweight
          并非所有的Flyweight子类都需要被共享。Flyweight接口使共享成为可能,但它并不强制共享。
          在Flyweight对象结构的某些层次,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点。
    
        4.FlyweightFactory
          创建并管理flyweight对象。
          确保合理地共享flyweight。当用户请求一个flyweight时,FlyweightFactory对象提供一个已创建的实例或者创建一个(如果不存在的话)。

    测试类:

     1 public class Test {
     2 
     3     public static void main(String[] args) { 
     4         Flyweight fly1 = FlyweightFactory.getFlyweight("a");
     5         fly1.action(1);
     6         
     7         Flyweight fly2 = FlyweightFactory.getFlyweight("a");
     8         System.out.println(fly1 == fly2);
     9         
    10         Flyweight fly3 = FlyweightFactory.getFlyweight("b");
    11         fly3.action(2);
    12         System.out.println(fly1==fly3);
    13         
    14         Flyweight fly4 = FlyweightFactory.getFlyweight("c");
    15         fly4.action(3);
    16         
    17         Flyweight fly5 = FlyweightFactory.getFlyweight("d");
    18         fly5.action(4);
    19         
    20         System.out.println(FlyweightFactory.getSize());
    21     }
    22 }
     1 import java.util.HashMap;
     2 import java.util.Map;
     3 
     4 public class FlyweightFactory {
     5 
     6     private static Map<String, Flyweight> flyweights = new HashMap<String, Flyweight>();
     7     
     8     public FlyweightFactory(String arg) {
     9         flyweights.put(arg, new FlyweightImpl());
    10     }
    11     
    12     public static Flyweight getFlyweight(String key) {
    13         if (flyweights.get(key) == null) {
    14             flyweights.put(key, new FlyweightImpl());
    15         }
    16         return flyweights.get(key);
    17     }
    18     
    19     public static int getSize() {
    20         return flyweights.size();
    21     }
    22 }
    public interface Flyweight {
    
        void action(int arg);
    }
    1 public class FlyweightImpl implements Flyweight {
    2 
    3     public void action(int arg) {
    4         // TODO Auto-generated method stub
    5         System.out.println("参数值: " + arg);
    6     }
    7 }
  • 相关阅读:
    Java8新特性之Collectors
    java日期的运用(DateUtils工具类)
    正则表达式30分钟入门教程
    一篇非常好的Spring教程
    结合实际需求,在webapi内利用WebSocket建立单向的消息推送平台,让A页面和服务端建立WebSocket连接,让其他页面可以及时给A页面推送消息
    关于企业微信对接内部应用开发,access_token的管理机制和业务接口调用项目实战的八个要点
    企业微信使用DevTools但显示为空白,解决方法
    16.刚体碰撞事件监测与处理
    15.碰撞体
    14.刚体组件Rigidbody
  • 原文地址:https://www.cnblogs.com/huzi007/p/4045242.html
Copyright © 2020-2023  润新知