Java设计模式—享元模式(Flyweight Pattern)

享元模式

业务需求

  • 小型外包项目,产品网站,不同客户要求不同
  • 有些客户要求以新闻形式发布;有些客户要求以博客形式发布;有些客户要求以微信公众号形式发布;

传统解决思路

  • 复制粘贴,根据不同用户的需求,各自修改
  • 每个网站各租用一个空间

传统解决思路问题分析

  • 交付的网站结构相似度很高,且访问量都不高;分别使用不同的虚拟空间,比较浪费服务器资源
  • 解决思路:整合到一个网站,共享其中相关代码和数据,减少服务器资源浪费
  • 对于代码来说,每个项目就是一个实例,维护和扩展更容易—享元模式

基本介绍

  • 享元模式也叫蝇量模式,运用共享技术有效的支持大量细粒度对象
  • 常用语系统底层开发,解决系统性能问题,如,数据库连接池,创建好的连接对象,拿来即用,避免重新创建,没有再创建
  • 享元模式能够解决重复对象的内存浪费的问题,当系统有大量相似对象,可以使用缓冲池,降低系统内存消耗,提高了效率
  • 享元模式的经典应用就是池技术,String常量池、数据库连接池、缓冲池等,是池技术的重要实现方式

在这里插入图片描述
在这里插入图片描述
原理类图说明

  • FlyWeight是抽象的享元角色,他是产品的抽象类,同事定义出对象的外部状态和内部状态的接口或实现类
  • ConcreteFlyWeight是具体的享元角色,是具体的产品类,实现抽象角色定义相关业务
  • UnSharedConcreteFlyWeight是不可共享的角色,一般不会出现在享元工厂
  • FlyWeightFactory享元工厂类,用于构建一个池容器(集合),同事提供从池中获取对象的方法

内部状态和外部状态

  • 享元模式提出两个要求:细粒度和共享对象。将对象信息分成两个部分,内部状态和外部状态
  • 内部状态指对象共享出来的信息,存储在享元对象内部且不会随着环境改变而改变
  • 外部状态指对象依赖的一个标记,随环境改变而改变,不可共享的状态

享元模式与单例模式

  • 单例模式是整个系统共用一个实例对象
  • 享元模式是整个系统共用几个同类型对象
  • 连接池本身是单例模式,连接池里的多个连接对象是享元模式
  • 享元模式的共享对象是按需分配的,如果不够再创建
  • 单例模式不会重复创建第二个对象,与享元模式要区分开

代码实现
在这里插入图片描述
网站抽象类,用于返回的实例

public abstract class WebSite {
   
    public abstract void use(User user);
}

网站实现类

public class ConcreteWebSite extends WebSite {
   
    private String type = "";//网站发布类型
    public ConcreteWebSite(String type) {
   
        this.type = type;
    }
    @Override
    public void use(User user) {
   
        System.out
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值