12.(结构型模式)java设计模式之享元模式

一、什么是享元模式

  Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意。享元模式是对象的结构模式。享元模式以共享的方式高效地支持大量的细粒度对象。

  • 属于结构型模式,主要用于减少创建对象的数量,以减少内存占用和提高性能,它提供了减少对象数量从而改善应用所需的对象结构的方式。
  • 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。

对象内容划分:

内部状态

  • 不会随环境的改变而有所不同,是可以共享的

外部状态

  • 不可以共享的,它随环境的改变而改变的,因此外部状态是由客户端来保持(因为环境的变化一般是由客户端引起的)

二、建造者的实现方式

模式结构分析:

  • 抽象享元(Flyweight)角色:为具体享元角色规定了必须实现的方法,而外部状态就是以参数的形式通过此方法传入。
  • 具体享元(ConcreteFlyweight)角色:实现抽象角色规定的方法。如果存在内部状态,就负责为内部状态提供存储空间。
  • 享元工厂(FlyweightFactory)角色:负责创建和管理享元角色。要想达到共享的目的,这个角色的实现是关键。
  • 客户端角色:维护对所有享元对象的引用,而且还需要存储对应的外部状态。

类关系图:

统一模型:

代码实现:

查看代码
/*
* 享元的抽象
* */
public abstract class CloudWebSite {
    public abstract void run(Company company);
}
/*
* 具体享元
* */
public class ConcreteWebSite extends CloudWebSite {

    private String category;
    public ConcreteWebSite(String category){
        this.category=category;
    }

    @Override
    public void run(Company company) {
        System.out.println("⽹站分类:"+category+", 公司:"+company.getName());
    }
}
/*
* 享元工厂
* */
public class WebSiteFactory {

    private Map<String,CloudWebSite> map = new HashMap<>();

    public CloudWebSite getWebSiteByCategory(String category){
        if(map.containsKey(category)){
            return map.get(category);
        }else {
            ConcreteWebSite site = new ConcreteWebSite(category);
            map.put(category,site);
            return site;
        }
    }
    /**
     * 获取分类个数
     * @return
     */
    public int getWebsiteCategorySize(){
        return map.size();
    }
}
/*
* 公司信息
* */
@Data
public class Company {
    String name;
    public Company(String name){
        this.name=name;
    }
}

测试用例:

/*
* 享元模式
* */
@Test
public void flyWeight(){
    WebSiteFactory factory = new WebSiteFactory();
    CloudWebSite companySite1 = factory.getWebSiteByCategory("企业官⽹");
    companySite1.run(new Company("⼩滴课堂"));
    CloudWebSite companySite2 = factory.getWebSiteByCategory("企业官⽹");
    companySite2.run(new Company("旭瑶课堂"));
    CloudWebSite byteDanceSite = factory.getWebSiteByCategory("信息流");
    byteDanceSite.run(new Company("字节跳动"));
    CloudWebSite ucNews = factory.getWebSiteByCategory("信息流");
    ucNews.run(new Company("优视科技"));
    System.out.println("⽹站分类总数:" +factory.getWebsiteCategorySize());
}

测试结果:

⽹站分类:企业官⽹, 公司:⼩滴课堂
⽹站分类:企业官⽹, 公司:旭瑶课堂
⽹站分类:信息流, 公司:字节跳动
⽹站分类:信息流, 公司:优视科技
⽹站分类总数:2

方法评估:

享元设计模式和原型、单例模式的区别:

  • 原型设计模式是指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。
  • 单例设计模式保证一个类仅有一个实例。

优点:

  • 大大减少了对象的创建,降低了程序内存的占用,提高效率。

缺点:

  • 提高了系统的复杂度,需要分离出内部状态和外部状态。
  • 注意划分内部状态和外部状态,否则可能会引起线程安全问题,必须有一个工厂类加以控制。
posted @   冰融心  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示