• 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 }
  • 相关阅读:
    Java基础101 给c:forEach的select下拉框中的值,设置默认值(后台传值,前台默认选中)
    Java进阶知识27 SSH整合(Struts2、Spring、Hibernate)
    错误/异常:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/classes/beans_common.xml]...的解决方法
    Java进阶知识26 Spring与Hibernate整合到一起
    Java进阶知识25 Spring的事务管理(事务回滚)
    spring各个版本源码
    sql之left join、right join、inner join的区别
    git命令之git stash 暂存临时代码
    apollo配置相关
    idea快捷键
  • 原文地址:https://www.cnblogs.com/huzi007/p/4045242.html
Copyright © 2020-2023  润新知