Java设计模式之享元模式示例详解

作者:温故知新之java 时间:2022-12-08 22:19:46 

定义

享元模式(FlyWeight Pattern),也叫蝇量模式,运用共享技术,有效的支持大量细粒度的对象,享元模式就是池技术的重要实现方式。

原理类图

Java设计模式之享元模式示例详解

  • Flyweight :抽象的享元角色,他是抽象的产品类,同时他会定义出对象的内部状态和外部状态

  • ConcreteFlyweight :是具体的享元角色,具体的产品类,实现抽象角色,实现具体的业务逻辑

  • UnsharedConcreteFlyweight :不可共享的角色,这个角色也可能出现在享元模式中

  • FlyweightFactory :享元工厂类,用于构建一个池的容器,同时在享元工厂里会提供公共方法 (从池子里获取对象,获取池子里的对象总数,根据key获取对象,,)

  • Client:客户端了,使用享元模式去完成业务逻辑

案例

需求

我们接了一个小型的外包项目,给客户老王做一个产品展示网页,老王的朋友们感觉效果不错,也希望做这样的产品展示网页,但是他们要求都有些不同

1)有客户要求网页以新闻的形式发布

2)有客户要求网页以博客的形式发布

3)有客户希望网页以微信公众号的形式发布

方案:享元模式

定义网站用户类

public class User {
   private String name;

public User(String name){
       this.name = name;
   }

public String getName() {
       return name;
   }

public void setName(String name) {
       this.name = name;
   }
}

定义网站抽象类——享元角色

public abstract class Website {
   public abstract void show(User user);
}

定义具体的网站类——具体的享元角色

public class ConcreteWebsite extends Website{
   // 网站的发布形式
   private String type;

public ConcreteWebsite(String type){
       this.type = type;
   }

@Override
   public void show(User user) {
       System.out.println("以" + type + "形式发布网站");
       System.out.println("网站的用户名是:" + user.getName());
   }
}

定义网站工厂类——享元工厂类

public class WebsiteFactory {
   // 创建HashMap,充当池的角色
   private HashMap<String, ConcreteWebsite> pool = new HashMap<String, ConcreteWebsite>();

// 根据类型判断,获取池子里的对象
   public Website getWebsite(String type){
       if(!pool.containsKey(type)){
           pool.put(type,new ConcreteWebsite(type));
       }
       return pool.get(type);
   }

// 获取池子里的对象总数
   public int getWebsiteCount(){
       System.out.println("当前池子里的对象总数:" + pool.size());
       return pool.size();
   }
}

定义客户端测试类

public class Client {
   public static void main(String[] args) {
       //创建一个享元工厂
       WebsiteFactory websiteFactory = new WebsiteFactory();
       Website news = websiteFactory.getWebsite("新闻");
       news.show(new User("老李"));
       Website wechat = websiteFactory.getWebsite("博客");
       wechat.show(new User("老高"));
       websiteFactory.getWebsiteCount();
       Website wechat1 = websiteFactory.getWebsite("微信");
       wechat.show(new User("老沈"));
       websiteFactory.getWebsiteCount();
   }
}

查看测试结果

Java设计模式之享元模式示例详解

分析

通过一个工厂类来根据不同类型的需求,从而生成对应的具体的享元对象,实现了需求。其中享元对象的信息分为两个部分,内部状态和外部状态。内部对象是指对象共享出来的信息,存储在享元对象内部,不随着环境的改变而改变,外部对象随着环境的改变而改变,不可共享的状态。

来源:https://juejin.cn/post/7070753861761253406

标签:Java,设计模式,享元模式
0
投稿

猜你喜欢

  • java必学必会之线程(2)

    2023-11-09 10:22:35
  • java搭建ftp/sftp进行数据传递的全过程

    2023-11-29 15:08:10
  • Java Fluent Mybatis实战之构建项目与代码生成篇下

    2023-11-24 10:59:52
  • Java 信号量Semaphore的实现

    2023-06-19 11:00:34
  • 使用开源项目JAVAE2 进行视频格式转换

    2023-11-08 07:18:24
  • Java中四种访问权限资料整理

    2021-12-04 13:23:58
  • java生成图片验证码实例代码

    2022-01-06 04:01:37
  • 详解Spring boot/Spring 统一错误处理方案的使用

    2023-11-24 12:56:07
  • ThreadLocal使用案例_动力节点Java学院整理

    2021-06-08 09:57:15
  • 一篇文章让你弄懂Java运算符

    2023-12-02 20:16:41
  • Java操作MongoDB数据库的示例代码

    2023-11-23 04:15:51
  • SpringCloud之微服务容错的实现

    2023-11-29 02:02:22
  • 使用GSON库将Java中的map键值对应结构对象转换为JSON

    2022-10-21 14:51:47
  • android TextView设置中文字体加粗实现方法

    2023-08-06 02:32:03
  • 微信公众号服务号推送模板消息设置方法(后端java)

    2023-11-20 08:27:58
  • SpringBoot中的main方法注入service

    2021-10-31 15:33:33
  • JavaEE7+Websockets+GlassFish4打造聊天室

    2023-11-29 01:01:39
  • 带你了解Java中Static关键字的用法

    2021-11-07 15:04:32
  • 详解Java分布式事务的 6 种解决方案

    2022-06-19 13:33:49
  • Java SpringBoot实现带界面的代码生成器详解

    2023-09-28 11:54:14
  • asp之家 软件编程 m.aspxhome.com