设计模式之享元模式

打印 上一主题 下一主题

主题 628|帖子 628|积分 1884

1.享元模式概念

        用于减少大量相似对象的内存消耗。通过共享尽大概多的数据来支持大量细粒度的对象,从而节省内存。
2.享元模式组成部分

1)享元接口 (Flyweight): 定义全部详细享元类的公共接口。

2)详细享元类 (Concrete Flyweight): 实现享元接口,并为内部状态存储内部数据。

3)非享元类 (Unshared Concrete Flyweight): 无法或不需要共享的对象。

4)享元工厂 (Flyweight Factory): 负责创建和管理享元对象,确保共享对象的精确管理。

3.举个栗子:

寝室有有一包卫生纸(享元对象),一包湿巾纸(享元对象)放在桌子上(享元工厂),用户(非享元对象)通过利用放在座子上的纸(享元接口)
如下图:

注:这个用缓存解释起来比较好,假如第一次访问某个静态资源,代理服务器(nginx),先看一下自己的缓存内里有没有这个资源,没有就问后端服务器要,向后端服务器要到之后在自己的当地缓存内里存一份,比及下次再有人访问这个哀求时,代理服务器(nginx)看了一下自己的当地缓存内里有这个资源,就不用向后端服务器要资源,相当于这次哀求走了(nginx)缓存,如许做减轻了后端服务器的压力
4.代码实现

1)享元接口

Paper 类

  1. package org.xiji.Flyweight;
  2. /**
  3. * Flyweight享元接口
  4. *
  5. * 卫生纸接口类
  6. */
  7. public interface Paper {
  8.     /**
  9.      *
  10.      * 使用卫生纸函数
  11.      */
  12.     void use(String name);
  13. }
复制代码
2)享元对象

ToiletPaperImpl 卫生纸

  1. package org.xiji.Flyweight;
  2. public class ToiletPaperImpl implements Paper{
  3.     @Override
  4.     public void use(String name) {
  5.         System.out.println(name+"使用了卫生纸");
  6.     }
  7. }
复制代码
WipesPaper 湿巾纸

  1. package org.xiji.Flyweight;
  2. public class WipesPaper implements Paper{
  3.     @Override
  4.     public void use(String name) {
  5.         System.out.println(name+"使用了湿巾");
  6.     }
  7. }
复制代码
3)享元工厂

PaperManger

  1. package org.xiji.Flyweight;
  2. /**
  3. * 享元工厂
  4. *
  5. *
  6. */
  7. public class PaperManger {
  8.     /**
  9.      * 卫生纸
  10.      */
  11.     ToiletPaperImpl toiletPaperImpl ;
  12.     /**
  13.      * 湿巾
  14.      */
  15.     WipesPaper wipesPaper ;
  16.     public Paper getInstance(String paperType) {
  17.         if (paperType.equals("卫生纸")) {
  18.             if (this.toiletPaperImpl == null) {
  19.                 this.toiletPaperImpl = new ToiletPaperImpl();
  20.             }
  21.             return  this.toiletPaperImpl;
  22.         }
  23.         if (paperType.equals("湿巾")) {
  24.             if (this.wipesPaper == null) {
  25.                 this.wipesPaper = new WipesPaper();
  26.             }
  27.             return this.wipesPaper;
  28.         }
  29.         return null;
  30.     }
  31. }
复制代码
4)客户端

FlyweightMain

  1. package org.xiji.Flyweight;
  2. /**
  3. * 享元模式测试类
  4. */
  5. public class FlyweightMain {
  6.     public static void main(String[] args) {
  7.         String zhangSan = "张三";
  8.         String xiaoJiu = "小久";
  9.         String xiJi = "惜己";
  10.         String liSi = "李四";
  11.         //获取卫生纸
  12.         PaperManger paperManger = new PaperManger();
  13.         Paper toiletPaper = paperManger.getInstance("卫生纸");
  14.         //获取湿巾
  15.         Paper wipesPaper = paperManger.getInstance("湿巾");
  16.         //使用
  17.         toiletPaper.use(zhangSan);
  18.         wipesPaper.use(xiaoJiu);
  19.         toiletPaper.use(xiJi);
  20.         wipesPaper.use(liSi);
  21.     }
  22. }
复制代码
5)运行结果




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

前进之路

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表