设计模式之享元模式笔记

news/2024/11/29 12:42:13/

设计模式之享元模式笔记

  • 说明
  • Flyweight(享元)
  • 目录
  • 享元模式示例类图
    • 抽象图形类
    • I图形类
    • L图形类
    • O图形类
    • 工厂类
    • 测试类

说明

记录下学习设计模式-享元模式的写法。JDK使用版本为1.8版本。

Flyweight(享元)

意图:运用共享技术有效地支持大量细粒度的对象。
结构:
在这里插入图片描述

其中:

  • Flyweight描述一个接口,通过这个接口Flyweight可以接受并作用于外部状态。
  • ConcreteFlyweight实现Flyweight接口,并为内部状态(如果有)增加存储空间。ConcreteFlyweight对象必须是可共享的。它所存储的状态必须是内部的,即它必须独立于ConcreteFlyweight对象的场景。
  • 并非所有的Flyweight子类都需要被共享。Flyweight接口使共享成为可能,但它并不强制共享。在Flyweight对象结构的某些层次,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点。
  • FlyweightFactory创建并管理Flyweight对象;确保合理地共享Flyweight,当用户请求一个Flyweight时,FlyweightFactory对象提供一个已创建的实例或者在不存在时创建一个实例。
  • Client维持一个对Flyweight的引用:计算或存储一个或多个Flyweight的外部状态。

适用性:

  • 一个应用程序使用了大量的对象。
  • 完全由于使用大量的对象,造成很大的存储开销。
  • 对象的大多数状态都可变为外部状态。
  • 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
  • 应用程序不依赖于对象标识。由于Flyweight对象可以被共享,所以对于概念上明显有别的对象,标识测试将返回真值。

使用场景:

  • 一个系统有大量相同或者相似的对象,造成内存的大量耗费。
  • 对象的大部分状态都可以外部化,可以将这些外部状态传入对象中。
  • 在使用享元模式时需要维护一个存储享元对象的享元池,而这需要耗费一定的系统资源,因此,应当在需要多次重复使用享元对象时才值得使用享元模式。

目录

在这里插入图片描述

享元模式示例类图

在这里插入图片描述
在这里插入图片描述
以该UML类图实现享元模式示例。

抽象图形类

package com.example.deesign_patterns.flyweight;//抽象享元角色
public abstract class AbstractBox {//获取图形的方法public abstract String getShape();//显示图形及颜色public void display(String color){System.out.println("方块形状:"+getShape()+",方块颜色:"+color);}
}

I图形类

package com.example.deesign_patterns.flyweight;//I图形类(具体享元角色)
public class IBox extends AbstractBox{@Overridepublic String getShape() {return "I";}
}

L图形类

package com.example.deesign_patterns.flyweight;//L图形类(具体享元角色)
public class LBox extends AbstractBox{@Overridepublic String getShape() {return "L";}
}

O图形类

package com.example.deesign_patterns.flyweight;//O图形类(具体享元角色)
public class OBox extends AbstractBox{@Overridepublic String getShape() {return "O";}
}

工厂类

package com.example.deesign_patterns.flyweight;import java.util.HashMap;//工厂类,将该类设计为单例
public class BoxFactory {private HashMap<String,AbstractBox> map;//使用单例模式-饿汉式静态成员变量方式private static BoxFactory factory=new BoxFactory();//在构造方法中进行初始化操作public BoxFactory() {map=new HashMap<String,AbstractBox>();map.put("I",new IBox());map.put("L",new LBox());map.put("O",new OBox());}//提供一个方法获取该工厂类对象public static BoxFactory getInstance(){return factory;}//根据名称获取图形对象public AbstractBox getShape(String name){return map.get(name);}
}

测试类

package com.example.deesign_patterns.flyweight;//测试类
public class Client {public static void main(String[] args) {//获取I图形对象AbstractBox box1 = BoxFactory.getInstance().getShape("I");box1.display("灰色");//获取L图形对象AbstractBox box2 = BoxFactory.getInstance().getShape("L");box2.display("绿色");//获取O图形对象AbstractBox box3 = BoxFactory.getInstance().getShape("O");box3.display("灰色");//获取O图形对象AbstractBox box4 = BoxFactory.getInstance().getShape("O");box4.display("红色");System.out.println("两次获取到的O图形对象是否是同一个对象:"+(box3==box4));}
}

在这里插入图片描述

好处:

  • 极大减少内存中相似或相同对象数量,节约系统资源,提供系统性能。
  • 享元模式中的外部状态相对独立,且不影响内部状态。

缺点:
为了使对象可以共享,需要将享元对象的部分状态外部化,分离内部状态和外部状态,使程序逻辑复杂。


http://www.ppmy.cn/news/535526.html

相关文章

广州史帝奇轨道环幕影院的优势、特点、应用领域

广州史帝奇轨道环幕影院是通过屏幕上的超长跨度的广阔画面充满观赏者的视野&#xff0c;全方位立体声与影片情节相辅相成、完美配合&#xff0c;演绎精彩绝伦的沉浸式视听享受。 场面宏大&#xff1a;可以提供0-360度无拼缝的全视景显影&#xff0c;无论观众选择何种观看视角&…

企业展厅里最流行的展示形式有哪些?

企业一般为了展示产品的内涵与价值&#xff0c;都会在展厅设计中融入数字多媒体技术来提升展厅体验度。其中最流行的表现形式为以下几种&#xff1a;全息投影、全息展柜、纱幕投影、折屏投幕、互动滑轨屏、雷达交互、虚拟驾驶、虚拟主持人、水晶讲台、透明屏、VR虚拟现实等&…

帖子如何实现显示浏览次数_LED显示屏如何实现无缝拼接

显示终端能否准确的将收集到的数据&#xff0c;及时呈现在显示墙上显得相当重要&#xff0c;直接关系到上级部门决策的合理性。为满足市场的需求&#xff0c;显示终端的技术人员改进了已有的技术&#xff0c;使之朝着无缝化、高清化方向发展&#xff0c;随即&#xff0c;无缝拼…

背投影拼接显示墙的组成及其种类[转]

背投影拼接显示墙的组成及其种类 大屏幕拼接是一个笼统的概念&#xff0c;目前大屏幕拼接主要有两种&#xff0c;一种是传统的显示墙硬拼接技术&#xff0c;另一种是采用边缘融合技术的无缝拼接技术。显示墙硬拼接技术主要 采用多个箱体拼接而成&#xff0c;如CRT背投显示墙、L…

光电显示技术 1 绪论

1绪论 1.1 光电显示技术概述 1.1.1 研究显示技术的意义 1.1.1.1 研究显示技术的意义 人类获取信息的方式&#xff1a; 电视和网络技术普及之前是: 视觉占60&#xff05;&#xff0c;听觉占20&#xff05;&#xff0c;触觉占15&#xff05;&#xff0c;味觉占3&#xff05;&…

东芝平板电视销售红火 放弃制造背投电视

东芝平板电视销售红火 放弃制造背投电视[more]【eNet硅谷动力消息】东芝&#xff08;美国&#xff09;公司宣布&#xff0c;它们将放弃背投电视的生产&#xff0c;集中力量制造平板显示器。公司同时宣布它们的46、47、52英寸REGZA 液晶电视已经投放市场&#xff0c;未来&#x…

清华紫光DLP大屏幕

清华紫光英力 DLP 大屏幕简介 清华紫光英力生产的大屏幕拼接设备&#xff0c;大屏幕拼接墙&#xff0c;大屏幕显示系统集成&#xff0c;大屏幕拼接工程&#xff0c;大屏幕背投拼接&#xff08;含 DLP 背投拼接&#xff0c; LCD 背投拼接&#xff0c; LCOS 背投拼接&#xff0c;…

星痕 轻松实现大屏数据可视化_买大数据可视化大屏幕,看这篇文章就够了

近年来&#xff0c;随着融媒体中心、智慧城市及安防产业的快速发展&#xff0c;拼接大屏逐渐成为各演播大厅、指挥控制室等场所不可或缺的一份子。形形色色的大屏专用名词&#xff0c;如LCD、LED、DID、DLP等&#xff0c;让不少人应接不暇。在这里&#xff0c;小编就从功耗、光…