Java设计模式之享元模式示例详解
作者:温故知新之java 发布时间:2022-12-08 22:19:46
定义
享元模式(FlyWeight Pattern),也叫蝇量模式,运用共享技术,有效的支持大量细粒度的对象,享元模式就是池技术的重要实现方式。
原理类图
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();
}
}
查看测试结果
分析
通过一个工厂类来根据不同类型的需求,从而生成对应的具体的享元对象,实现了需求。其中享元对象的信息分为两个部分,内部状态和外部状态。内部对象是指对象共享出来的信息,存储在享元对象内部,不随着环境的改变而改变,外部对象随着环境的改变而改变,不可共享的状态。
来源:https://juejin.cn/post/7070753861761253406


猜你喜欢
- 一、负载均衡负载均衡(Load Balance): 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞
- 本文实例为大家分享了Android实现闪屏页效果的具体代码,供大家参考,具体内容如下1.效果图2.闪屏页逻辑及布局2.1 activity_
- 你是否遇到过应用程序性能下降的问题?有没有想过提升Spring性能?如果是这样 - 那么这篇文章绝对适合你。在这里,我们将谈论使用超级强大和
- 一、new 对象的几种说法初学 Java 面向对象的时候,实例化对象的说法有很多种,我老是被这些说法给弄晕。public class Tes
- 实际上java已经提供线程池的实现 ExecutorService。为了更方便的使用和管理。这里提供一个线程池工具类,方便大家的使用。直接看
- 目的官方的Drools范例大都是基于纯Java项目或Maven项目,而基于Spring Boot项目的很少。本文介绍如何在Spring Bo
- 背景在开发中,如果用try catch的方式,每个方法都需要单独实现,为了方便分类异常,返回给前端,采用了@ControllerAdvice
- abstract可以用来修饰类,方法,属性,索引器和时间,这里不包括字段. 使用abstrac修饰的类,该类只能作为其他类的基类,不能实例化
- 实践过程效果代码public partial class Form1 : Form{ public Form1()
- 目录前言示例参考:前言按需加载对象延迟加载实际是推迟进行创建对象,直到对其调用后才进行创建初始化,延迟(懒加载)的好处是提高系统性能,避免不
- 为了创建比例大小的子View,可以将LinearLayout的宽度和高度设为fill_parent, 而将子View的宽度或是高度设为0,然
- TCP和UDP在网络传输中非常重要,在Android开发中同样重要。首先我们来看一下什么是TCP和UDP。什么是TCP?TCP:Transm
- 前言spring-boot-actuator是一个spring-boot提供的用于监控组件,只需要在代码中加入依赖就可以了<depen
- MyBatis Generator简介MyBatis Generator(MBG)是MyBatis MyBatis 和iBATIS的代码生成
- 原来一直使用shiro做安全框架,配置起来相当方便,正好有机会接触下SpringSecurity,学习下这个。顺道结合下jwt,把安全信息管
- Java对象内存构成今天来讲些抽象的东西 -- 对象头,因为我在学习的过程中发现很多地方都关联到了对象头的知识点,例如JDK中的 synch
- Java7引入了Fork Join的概念,来更好的支持并行运算。顾名思义,Fork Join类似与流程语言的分支,合并的概念。也就是说Jav
- 1、Java版package com.lyz.utils.common; import java.io.UnsupportedEncodin
- DATAXDataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、Oracle、SqlServer、Postg
- C#客户端程序,生成后是一个exe,如果带有大量的dll,那么dll和exe会混乱在一起,看起来非常混乱,我们可以建立一个文件夹,把dll放