设计模式一享元模式
欢迎光临我的博客[http://poetize.cn],前端使用Vue2,聊天室使用Vue3,后台使用Spring Boot
概述
相同对象只要保存一份,这降低了系统中对象的数量,
从而降低了系统中细粒度对象给内存带来的压力。
元模式会创建一个享元池将这些公共的实例保存在享元池中。
池技术了,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 }