设计模式--结构模式--享元模式

一、基本概念

  1、享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式。

      2、角色

           A:享元工厂:用于创建具体享元类,维护相同的享元对象。当请求对象已经存在时,直接返回对象,不存在时,在创建对象。

           B:抽象享元:定义需要共享的对象业务接口。享元类被创建出来总是为了实现某些特定的业务逻辑.

           C:具体享元:实现抽象享元类的接口,完成某一具体逻辑。

           D:Client:客户端

二、简单例子

           A:享元工厂:

 1 package comm.pattern.struct.flyweight;
 2 
 3 import java.util.HashMap;
 4 
 5 /**
 6  * 
 7  * @Title: BanknoteFactory.java
 8  * @Package: comm.pattern.struct.flyweight
 9  * @Description: 中央银行
10  * @author yangzhancheng
11  * @2020年3月19日:下午7:32:02
12  *
13  */
14 public class BanknoteFactory {
15 
16     private HashMap<String,IBanknote> banknoteMap = new HashMap<String,IBanknote>();
17     
18     private IBanknote Banknote;
19     
20     /**
21      * 
22      * @param face
23      * @return
24      */
25     public IBanknote builder(String face){
26         if(null == banknoteMap.get(face)){
27             Banknote = new Banknote(face);
28             banknoteMap.put(face, Banknote);
29             System.out.println("没有这个模版,创建模版:"+face);
30         }else{
31             Banknote = banknoteMap.get(face);
32             System.out.println("这个模版存在,创建模版:"+face);
33         }
34         
35         return Banknote;
36     }
37 }
View Code

           B:抽象享元:

 1 package comm.pattern.struct.flyweight;
 2 
 3 /**
 4  * 
 5  * @Title: IBanknote.java
 6  * @Package: comm.pattern.struct.flyweight
 7  * @Description: 印钞版
 8  * @author yangzhancheng
 9  * @2020年3月19日:下午7:19:46
10  *
11  */
12 public interface IBanknote {
13 
14     //印钞版的面值
15     public void face();
16 }
View Code

           C:具体享元:

扫描二维码关注公众号,回复: 9971322 查看本文章
 1 package comm.pattern.struct.flyweight;
 2 
 3 /**
 4  * 
 5  * @Title: Banknote.java
 6  * @Package: comm.pattern.struct.flyweight
 7  * @Description: 印钞模版
 8  * @author yangzhancheng
 9  * @2020年3月19日:下午7:22:25
10  *
11  */
12 public class Banknote implements IBanknote {
13 
14     private String face;
15     
16     public Banknote (String face){
17         this.face = face;
18     }
19     
20     @Override
21     public void face() {
22         System.out.println("印钞模版的面额是:"+face);
23     }
24 
25 }
View Code

           D:Client:

 1 package comm.pattern.struct.flyweight;
 2 
 3 import java.util.HashMap;
 4 
 5 /**
 6  * 
 7  * @Title: Client.java
 8  * @Package: comm.pattern.struct.adapter
 9  * @Description: 客户端
10  * @author yangzhancheng
11  * @2020年3月18日:下午8:49:23
12  *
13  */
14 public class Client {
15 
16     public static void main(String[] args) {
17 
18         BanknoteFactory banknoteFactory = new BanknoteFactory();
19         
20         IBanknote Banknote =  banknoteFactory.builder("10元");
21         Banknote.face();
22         
23         Banknote =  banknoteFactory.builder("10元");
24         Banknote.face();
25         
26         Banknote =  banknoteFactory.builder("5元");
27         Banknote.face();
28         
29         Banknote =  banknoteFactory.builder("100元");
30         Banknote.face();
31     }
32 
33 }
View Code

运行结果

没有这个模版,创建模版:10元
印钞模版的面额是:10元
这个模版存在,创建模版:10元
印钞模版的面额是:10元
没有这个模版,创建模版:5元
印钞模版的面额是:5元
没有这个模版,创建模版:100元
印钞模版的面额是:100元

三、总结

     与单例模式的比较:

    1、享元设计模式是一个类有很多对象,而单例是一个类仅一个对象。

    2、享元模式是为了节约内存空间,提升程序性能,而单例模式则主要是出于共享状态的目的。

猜你喜欢

转载自www.cnblogs.com/fating/p/12526954.html
今日推荐