设计模式一享元模式

 

欢迎光临我的博客[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 }
posted @ 2019-07-31 22:10  LittleDonkey  阅读(128)  评论(0编辑  收藏  举报