• 设计模式一享元模式


    概述

    相同对象只要保存一份,这降低了系统中对象的数量,
    从而降低了系统中细粒度对象给内存带来的压力。

    元模式会创建一个享元池将这些公共的实例保存在享元池中。

    池技术了,String常量池、数据库连接池、缓冲池等等都是享元模式的应用

    享元模式是池技术的重要实现方式。

    我们每次创建字符串对象时,都需要创建一个新的字符串对象的话,内存开销会很大,

    所以如果第一次创建了字符串对象“adam“,

    下次再创建相同的字符串”adam“时,只是把它的引用指向”adam“,

    这样就实现了”adam“字符串再内存中的共享。

     1 import java.util.HashMap;
     2 
     3 public class Flyweight {
     4     public static void main(String[] args) {
     5         Share a = FlyweightFactory.getFlyweight("a");
     6         a.operate(new UnsharedConcreteFlyweight());
     7         Share b = FlyweightFactory.getFlyweight("a");
     8     }
     9 }
    10 
    11 /**
    12  * Flyweight (享元抽象类):
    13  * 一般是接口或者抽象类,定义了享元类的公共方法。
    14  * 非享元的外部状态以参数的形式通过方法传入。
    15  */
    16 abstract class Share {
    17     //操作接口
    18     public abstract void operate(UnsharedConcreteFlyweight un);
    19 }
    20 
    21 /**
    22  * ConcreteFlyweight(具体享元类):
    23  * 具体享元类实现了抽象享元类的方法,
    24  * 为享元对象开辟了内存空间来保存享元对象的内部数据,
    25  * 同时可以通过和单例模式结合只创建一个享元对象。
    26  */
    27 class concreteFlyweight extends Share {
    28     //共享信息
    29     private String share;
    30 
    31     public concreteFlyweight(String share) {
    32         this.share = share;
    33     }
    34 
    35     @Override
    36     public void operate(UnsharedConcreteFlyweight un) {
    37         System.out.println(share);
    38         un.show();
    39     }
    40 }
    41 
    42 /**
    43  * UnsharedConcreteFlyweight类
    44  *   指那些不需要共享的Flyweight子类。
    45  */
    46 class UnsharedConcreteFlyweight {
    47     public void show() {
    48         System.out.println("地点");
    49     }
    50 }
    51 
    52 /**
    53  * FlyweightFactory类
    54  *   一个享元工厂,用来创建并管理Flyweight对象,主要是用来确保合理地共享Flyweight
    55  */
    56 class FlyweightFactory {
    57     //定义一个容量池
    58     private static volatile HashMap<String, Share> hash = new HashMap<>();
    59 
    60     //享元工厂
    61     public static Share getFlyweight(String inner) {
    62         Share fly = null;
    63         if (hash.containsKey(inner)) {
    64             System.out.println("存在");
    65             fly = hash.get(inner);
    66         } else {
    67             System.out.println("不存在");
    68             fly = new concreteFlyweight(inner);
    69             hash.put(inner, fly);
    70         }
    71         return fly;
    72     }
    73 }
  • 相关阅读:
    java实现万年历
    java中关于Calendar
    java中各种类型的输入输出
    java(向上向下转型)
    MyEclipse还原默认窗口
    Hibernate映射问题之OneToOne【自己整理】
    Neither BindingResult nor plain target object for bean
    剑宗与气宗
    分治算法
    spring处理线程并发
  • 原文地址:https://www.cnblogs.com/loveer/p/11279461.html
Copyright © 2020-2023  润新知