大话设计模式——14.享元模式(Flyweight Pattern)

简介

尝试重用现有的同类对象,未找到匹配的对象,则创建新对象。它提供了减少对象数量从而改善应用所需的对象结构的方式

UML图:
在这里插入图片描述

应用场景:

  • Java的String类型数据,字符串常量池中存在则并返回,没有则创建字符串并保存在字符串常量池中
  • 系统中存在大量相似对象,需要进行池化的时候,如数据库连接池、线程池等
  • 需要生成大量的细粒度的实例,且实例大体相似
示例
  1. 抽象享元对象
public abstract class Website {

    public abstract void use(Business business);
}
public class Business {

    /**
     * 商家名称
     */
    private String name;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  1. 具体享元对象:
public class ConcretWebsite extends  Website{

    private String category;

    public ConcretWebsite(String category) {
        this.category = category;
    }

    @Override
    public void use(Business business) {
        System.out.println("网站类型:"+this.category+" 网站名称"+business.getName());
    }
}
  1. 享元工厂
public class WebsiteFactory {

    private Map<String, Website> websiteMap = new HashMap<>();

    /**
     * 获取网站
     *
     * @param category
     * @return
     */
    public Website getWebsite(String category) {
        if (websiteMap.containsKey(category)) {
            return websiteMap.get(category);
        } else {
            ConcretWebsite concretWebsite = new ConcretWebsite(category);
            websiteMap.put(category, concretWebsite);
            return concretWebsite;
        }
    }


    /**
     * 获取网站数量
     *
     * @return
     */
    public int getCount() {
        return websiteMap.size();
    }
}
  1. 运行
public class Main {

    public static void main(String[] args) {
        WebsiteFactory websiteFactory = new WebsiteFactory();
        Website website = websiteFactory.getWebsite("外卖小程序");
        website.use(new Business("蜜雪"));
        website.use(new Business("烧仙草"));

        Website website1 = websiteFactory.getWebsite("博客");
        website1.use(new Business("财经"));
        website1.use(new Business("地理"));

        System.out.println("网站个数:" + websiteFactory.getCount());

    }
}

在这里插入图片描述

总结
  • 优点

    • 可以减少对象的创建,减少程序内存的占用,提高系统性能
  • 缺点

    • 增加了系统的复杂性
    • 必须有一个工厂类加以控制
VS 原型、单例模式
  • 原型模式指定创建对象的种类,通过拷贝这些原型创建新对象,本质拷贝一次创建一个新对象
  • 单例模式保证一个类仅有一个对象创建

相关推荐

  1. 设计模式(10):模式

    2024-04-08 18:18:02       31 阅读
  2. 设计模式11、flyweight 模式

    2024-04-08 18:18:02       35 阅读
  3. 模式(大话设计模式)C/C++版本

    2024-04-08 18:18:02       22 阅读
  4. 设计模式

    2024-04-08 18:18:02       58 阅读
  5. 设计模式-模式

    2024-04-08 18:18:02       58 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-08 18:18:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-08 18:18:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-08 18:18:02       87 阅读
  4. Python语言-面向对象

    2024-04-08 18:18:02       96 阅读

热门阅读

  1. P8605 [蓝桥杯 2013 国 AC] 网络寻路

    2024-04-08 18:18:02       28 阅读
  2. UDP协议

    UDP协议

    2024-04-08 18:18:02      31 阅读
  3. 跨域问题及解决方案

    2024-04-08 18:18:02       36 阅读
  4. 【软件架构学习】一、基本概念

    2024-04-08 18:18:02       33 阅读
  5. 《空对象模式(极简c++)》

    2024-04-08 18:18:02       34 阅读
  6. QString()和QString(““)的区别

    2024-04-08 18:18:02       33 阅读
  7. 移动应用开发实验室三面题分析

    2024-04-08 18:18:02       21 阅读
  8. Qt 容器类整理与使用

    2024-04-08 18:18:02       27 阅读