<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      潦草白紙

      設計模式學習心得<享元模式 Flyweight>

      享元模式(Flyweight Pattern)主要用于減少創建對象的數量,以減少內存占用和提高性能。這種類型的設計模式屬于結構型模式,它提供了減少對象數量從而改善應用所需的對象結構的方式。

      享元模式嘗試重用現有的同類對象,如果未找到匹配的對象,則創建新對象。

      概述


      • 意圖
        運用共享技術有效地支持大量細粒度的對象。

      • 主要解決
        在有大量對象時,有可能會造成內存溢出,我們把其中共同的部分抽象出來,如果有相同的業務請求,直接返回在內存中已有的對象,避免重新創建。

      • 何時使用

      1. 系統中有大量對象。
      2. 這些對象消耗大量內存。
      3. 這些對象的狀態大部分可以外部化。
      4. 這些對象可以按照內蘊狀態分為很多組,當把外蘊對象從對象中剔除出來時,每一組對象都可以用一個對象來代替。
      5. 系統不依賴于這些對象身份,這些對象是不可分辨的。
      • 如何解決
        用唯一標識碼判斷,如果在內存中有,則返回這個唯一標識碼所標識的對象。

      • 關鍵代碼
        用 HashMap 存儲這些對象。

      • 應用實例

      1. JAVA 中的 String,如果有則返回,如果沒有則創建一個字符串保存在字符串緩存池里面。
      2. 數據庫的數據池。
      3. hibernate-validate自定義了基于弱引用的緩存容器ConcurrentReferenceHashMap
      • 優點
        大大減少對象的創建,降低系統的內存,使效率提高。

      • 缺點
        提高了系統的復雜度,需要分離出外部狀態和內部狀態,而且外部狀態具有固有化的性質,不應該隨著內部狀態的變化而變化,否則會造成系統的混亂。

      • 使用場景

      1. 系統有大量相似對象。
      2. 需要緩沖池的場景。
      • 注意事項
      1. 注意劃分外部狀態和內部狀態,否則可能會引起線程安全問題。
      2. 這些類必須有一個工廠對象加以控制。

      實現


      摘抄hibernate-validate源碼

      容器:ConcurrentReferenceHashMap

      調用摘抄

      /**
       * This manager is in charge of providing all constraint related meta data
       * required by the validation engine.
       * <p>
       * Actual retrieval of meta data is delegated to {@link MetaDataProvider}
       * implementations which load meta-data based e.g. based on annotations or XML.
       * </p>
       * <p>
       * For performance reasons a cache is used which stores all meta data once
       * loaded for repeated retrieval. Upon initialization this cache is populated
       * with meta data provided by the given <i>eager</i> providers. If the cache
       * doesn't contain the meta data for a requested type it will be retrieved on
       * demand using the annotation based provider.
       * </p>
       *
       * @author Gunnar Morling
       * @author Chris Beckey &lt;cbeckey@paypal.com&gt;
       * @author Guillaume Smet
      */
      public class BeanMetaDataManager {
      	/**
      	 * The default initial capacity for this cache.
      	 */
      	private static final int DEFAULT_INITIAL_CAPACITY = 16;
      
      	/**
      	 * The default load factor for this cache.
      	 */
      	private static final float DEFAULT_LOAD_FACTOR = 0.75f;
      
      	/**
      	 * The default concurrency level for this cache.
      	 */
      	private static final int DEFAULT_CONCURRENCY_LEVEL = 16;
      
      	/**
      	 * Additional metadata providers used for meta data retrieval if
      	 * the XML and/or programmatic configuration is used.
      	 */
      	@Immutable
      	private final List<MetaDataProvider> metaDataProviders;
      
      	/**
      	 * Helper for builtin constraints and their validator implementations
      	 */
      	private final ConstraintHelper constraintHelper;
      
      	/**
      	 * Used for resolving generic type information.
      	 */
      	private final TypeResolutionHelper typeResolutionHelper;
      
      	/**
      	 * The {@link ValueExtractor} manager.
      	 */
      	private final ValueExtractorManager valueExtractorManager;
      
      	private final ExecutableParameterNameProvider parameterNameProvider;
      
      	/**
      	 * Used to cache the constraint meta data for validated entities
      	 */
      	private final ConcurrentReferenceHashMap<Class<?>, BeanMetaData<?>> beanMetaDataCache;
      
      	/**
      	 * Used for resolving type parameters. Thread-safe.
      	 */
      	private final ExecutableHelper executableHelper;
      
      	private final ValidationOrderGenerator validationOrderGenerator;
      
      	/**
      	 * the three properties in this field affect the invocation of rules associated to section 4.5.5
      	 * of the specification.  By default they are all false, if true they allow
      	 * for relaxation of the Liskov Substitution Principal.
      	 */
      	private final MethodValidationConfiguration methodValidationConfiguration;
      
      	public BeanMetaDataManager(ConstraintHelper constraintHelper,
      			ExecutableHelper executableHelper,
      			TypeResolutionHelper typeResolutionHelper,
      			ExecutableParameterNameProvider parameterNameProvider,
      			ValueExtractorManager valueExtractorManager,
      			ValidationOrderGenerator validationOrderGenerator,
      			List<MetaDataProvider> optionalMetaDataProviders,
      			MethodValidationConfiguration methodValidationConfiguration) {
      		this.constraintHelper = constraintHelper;
      		this.executableHelper = executableHelper;
      		this.typeResolutionHelper = typeResolutionHelper;
      		this.valueExtractorManager = valueExtractorManager;
      		this.parameterNameProvider = parameterNameProvider;
      		this.validationOrderGenerator = validationOrderGenerator;
      
      		this.methodValidationConfiguration = methodValidationConfiguration;
      
      		this.beanMetaDataCache = new ConcurrentReferenceHashMap<>(
      				DEFAULT_INITIAL_CAPACITY,
      				DEFAULT_LOAD_FACTOR,
      				DEFAULT_CONCURRENCY_LEVEL,
      				SOFT,
      				SOFT,
      				EnumSet.of( IDENTITY_COMPARISONS )
      		);
      
      		AnnotationProcessingOptions annotationProcessingOptions = getAnnotationProcessingOptionsFromNonDefaultProviders( optionalMetaDataProviders );
      		AnnotationMetaDataProvider defaultProvider = new AnnotationMetaDataProvider(
      				constraintHelper,
      				typeResolutionHelper,
      				valueExtractorManager,
      				annotationProcessingOptions
      		);
      		List<MetaDataProvider> tmpMetaDataProviders = new ArrayList<>( optionalMetaDataProviders.size() + 1 );
      		// We add the annotation based metadata provider at the first position so that the entire metadata model is assembled
      		// first.
      		// The other optional metadata providers will then contribute their additional metadata to the preexisting model.
      		// This helps to mitigate issues like HV-1450.
      		tmpMetaDataProviders.add( defaultProvider );
      		tmpMetaDataProviders.addAll( optionalMetaDataProviders );
      
      		this.metaDataProviders = CollectionHelper.toImmutableList( tmpMetaDataProviders );
      	}
      
      	@SuppressWarnings("unchecked")
      	public <T> BeanMetaData<T> getBeanMetaData(Class<T> beanClass) {
      		Contracts.assertNotNull( beanClass, MESSAGES.beanTypeCannotBeNull() );
      
      		BeanMetaData<T> beanMetaData = (BeanMetaData<T>) beanMetaDataCache.computeIfAbsent( beanClass,
      				bc -> createBeanMetaData( bc ) );
      
      		return beanMetaData;
      	}
      
      	public void clear() {
      		beanMetaDataCache.clear();
      	}
      
      	public int numberOfCachedBeanMetaDataInstances() {
      		return beanMetaDataCache.size();
      	}
      }
      

      posted on 2018-07-01 18:33  潦草白紙  閱讀(409)  評論(0)    收藏  舉報

      導航

      主站蜘蛛池模板: 国内精品视频一区二区三区八戒 | 久久精品亚洲日本波多野结衣| 和硕县| 亚洲日本乱码熟妇色精品| 国产成人无码综合亚洲日韩| 深夜福利国产精品中文字幕| 美乳丰满人妻无码视频| 东京热人妻无码一区二区av| 精品乱码一区二区三四五区| 国产在线超清日本一本| 我要看亚洲黄色太黄一级黄 | 天堂中文8资源在线8| 天堂亚洲免费视频| 国产成AV人片久青草影院| 亚洲欧美中文日韩v在线97| 亚洲成人精品综合在线| 国自产在线精品一本无码中文| 97久久综合亚洲色hezyo| 欧美不卡一区二区三区| 亚洲成av人片天堂网无码| 亚洲爆乳少妇无码激情| 亚洲精品99久久久久久欧美版| 亚洲综合精品一区二区三区| 亚洲国产精品日韩AV专区| 吐鲁番市| 中文字幕av日韩有码| 日本一区二区三区后入式| 日韩av综合中文字幕| 大香伊蕉在人线国产最新2005| 亚洲乱码中文字幕小综合| 日本人妻巨大乳挤奶水免费| 国产成人综合亚洲欧美日韩| 黄冈市| 日韩中文字幕综合第二页| 亚洲熟女精品一区二区| 中文国产日韩欧美二视频| 斗六市| av在线播放观看国产| 樱桃视频影院在线播放| 在线高清免费不卡全码| 亚洲av色精品一区二区|