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

2024-04-08 19:28

本文主要是介绍大话设计模式——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;}@Overridepublic 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 原型、单例模式
  • 原型模式指定创建对象的种类,通过拷贝这些原型创建新对象,本质拷贝一次创建一个新对象
  • 单例模式保证一个类仅有一个对象创建

这篇关于大话设计模式——14.享元模式(Flyweight Pattern)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/886322

相关文章

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

解读静态资源访问static-locations和static-path-pattern

《解读静态资源访问static-locations和static-path-pattern》本文主要介绍了SpringBoot中静态资源的配置和访问方式,包括静态资源的默认前缀、默认地址、目录结构、访... 目录静态资源访问static-locations和static-path-pattern静态资源配置

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素