1.享元模式概念
用于减少大量相似对象的内存消耗。通过共享尽大概多的数据来支持大量细粒度的对象,从而节省内存。
2.享元模式组成部分
1)享元接口 (Flyweight): 定义全部详细享元类的公共接口。
2)详细享元类 (Concrete Flyweight): 实现享元接口,并为内部状态存储内部数据。
3)非享元类 (Unshared Concrete Flyweight): 无法或不需要共享的对象。
4)享元工厂 (Flyweight Factory): 负责创建和管理享元对象,确保共享对象的精确管理。
3.举个栗子:
寝室有有一包卫生纸(享元对象),一包湿巾纸(享元对象)放在桌子上(享元工厂),用户(非享元对象)通过利用放在座子上的纸(享元接口)
如下图:
注:这个用缓存解释起来比较好,假如第一次访问某个静态资源,代理服务器(nginx),先看一下自己的缓存内里有没有这个资源,没有就问后端服务器要,向后端服务器要到之后在自己的当地缓存内里存一份,比及下次再有人访问这个哀求时,代理服务器(nginx)看了一下自己的当地缓存内里有这个资源,就不用向后端服务器要资源,相当于这次哀求走了(nginx)缓存,如许做减轻了后端服务器的压力
4.代码实现
1)享元接口
Paper 类
- package org.xiji.Flyweight;
- /**
- * Flyweight享元接口
- *
- * 卫生纸接口类
- */
- public interface Paper {
- /**
- *
- * 使用卫生纸函数
- */
- void use(String name);
- }
复制代码 2)享元对象
ToiletPaperImpl 卫生纸
- package org.xiji.Flyweight;
- public class ToiletPaperImpl implements Paper{
- @Override
- public void use(String name) {
- System.out.println(name+"使用了卫生纸");
- }
- }
复制代码 WipesPaper 湿巾纸
- package org.xiji.Flyweight;
- public class WipesPaper implements Paper{
- @Override
- public void use(String name) {
- System.out.println(name+"使用了湿巾");
- }
- }
复制代码 3)享元工厂
PaperManger
- package org.xiji.Flyweight;
- /**
- * 享元工厂
- *
- *
- */
- public class PaperManger {
- /**
- * 卫生纸
- */
- ToiletPaperImpl toiletPaperImpl ;
- /**
- * 湿巾
- */
- WipesPaper wipesPaper ;
- public Paper getInstance(String paperType) {
- if (paperType.equals("卫生纸")) {
- if (this.toiletPaperImpl == null) {
- this.toiletPaperImpl = new ToiletPaperImpl();
- }
- return this.toiletPaperImpl;
- }
- if (paperType.equals("湿巾")) {
- if (this.wipesPaper == null) {
- this.wipesPaper = new WipesPaper();
- }
- return this.wipesPaper;
- }
- return null;
- }
- }
复制代码 4)客户端
FlyweightMain
- package org.xiji.Flyweight;
- /**
- * 享元模式测试类
- */
- public class FlyweightMain {
- public static void main(String[] args) {
- String zhangSan = "张三";
- String xiaoJiu = "小久";
- String xiJi = "惜己";
- String liSi = "李四";
- //获取卫生纸
- PaperManger paperManger = new PaperManger();
- Paper toiletPaper = paperManger.getInstance("卫生纸");
- //获取湿巾
- Paper wipesPaper = paperManger.getInstance("湿巾");
- //使用
- toiletPaper.use(zhangSan);
- wipesPaper.use(xiaoJiu);
- toiletPaper.use(xiJi);
- wipesPaper.use(liSi);
- }
- }
复制代码 5)运行结果
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |