首页 > 其他分享 >23种设计模式之享元模式

23种设计模式之享元模式

时间:2024-06-20 16:32:38浏览次数:21  
标签:享元 23 对象 IgoChessmanFactory 设计模式 IgoChessman public 享元类

享元模式

1、定义

享元模式:运用共享技术有效的支持大量细粒度对象的复用

2、享元模式结构

  • Flyweight(抽象享元类):通常是一个接口或抽象类,在抽象享元类中声明了具体享元类公共的方法,这些方法可以向外界提供享元对象的内部数据(状态),同时也可以通过这些方法来设置外部数据(状态)
  • ConcreteFlyweight(具体享元类):实现抽象享元类,其实例称为享元对象,在具体享元类中为内部状态提供了存储空间。通常可以结合单例模式来设计具体享元类,为每一个具体享元类提供唯一的享元对象
  • UnsharedConcreteFlyweight(非共享具体享元类):并不是所有的抽象享元类的子类都需要被共享,不能被共享的子类可设计为非共享具体享元类。可直接通过实例化创建
  • FlyweightFactory(享元工厂类):用于创建并管理享元对象

享元模式结构图

3、示例

开发一个围棋软件,会发现棋子的形状大小完全相同,只是颜色和位置不同。如果每个棋子都作为一个独立的对象存储在内存中,会导致需要大量的内存空间,为了解决这个问题,可以用到享元模式

围棋棋子类

public abstract class IgoChessman {
    public abstract String getColor();

    public void display() {
        System.out.println("棋子颜色:" + this.getColor());
    }
}

黑子、白子具体实现类

public class BlackIgoChessman extends IgoChessman{
    @Override
    public String getColor() {
        return "黑色";
    }
}
public class WhiteIgoChessman extends IgoChessman {
    @Override
    public String getColor() {
        return "白色";
    }
}

棋子工厂类 使用了单例模式对其进行设计

public class IgoChessmanFactory {

    private static IgoChessmanFactory instance = new IgoChessmanFactory();
    private static Hashtable hashtable;

    private IgoChessmanFactory() {
        hashtable = new Hashtable();
        IgoChessman black,white;
        black = new BlackIgoChessman();
        hashtable.put("black", black);
        white = new WhiteIgoChessman();
        hashtable.put("white", white);
    }

    public static IgoChessmanFactory getInstance() {
        return instance;
    }

    public IgoChessman getIgoChessman(String color) {
        return (IgoChessman) hashtable.get(color);
    }
}

Client

public class Client {

    public static void main(String[] args) {
        IgoChessman black1, black2, white1, white2;
        IgoChessmanFactory factory;

        factory = IgoChessmanFactory.getInstance();

        black1 = factory.getIgoChessman("black");
        black2 = factory.getIgoChessman("black");
        System.out.println("判断两颗黑子是否相同:" + (black1 == black2));

        white1 = factory.getIgoChessman("white");
        white2 = factory.getIgoChessman("white");
        System.out.println("判断两颗白子是否相同:" + (white1 == white2));

        black1.display();
        white1.display();
    }
}

输出结果

判断两颗黑子是否相同:true
判断两颗白子是否相同:true
棋子颜色:黑色
棋子颜色:白色

4、享元模式优缺点

4.1优点
  • 可以减少内存中对象的数量,节约系统资源,提高系统性能(String类
  • 享元模式的外部状态相对独立,不会影响其内部状态,从而使享元对象可以再不同环境中被使用
4.2缺点
  • 使系统变得复杂,需要分离出内部状态和外部状态
  • 为了使对象可以共享,需要将享元对象的部分状态外部化,读取外部状态将使运行时间变长

5、享元模式适用环境

当都具备下列情况时,使用Flyweight模式:

1.一个应用程序使用了大量的对象。

2.完全由于使用大量的对象,造成很大的存储开销。

3.对象的大多数状态都可变为外部状态。

4.如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。

5.应用程序不依赖于对象标识。Flyweight对象可以被共享。

标签:享元,23,对象,IgoChessmanFactory,设计模式,IgoChessman,public,享元类
From: https://blog.csdn.net/qq_38811830/article/details/139710307

相关文章

  • CSP历年复赛题-P9749 [CSP-J 2023] 公路
    原题链接:https://www.luogu.com.cn/problem/P9749题意解读:有n个加油点,每个加油点距离、油价不同,每升油走d公里,加油必须整升加,问走完所有点最少加油的金额。解题思路:本题有两种思考方式:1、先走,再看油从哪里加依次走到第2,3,4......n个加油点,看每两个点之间距离需要加多少油由......
  • 5.23实验二 SQL 语言的使用
    一、实验目的:掌握使用SQL语言进行各种查询的操作和视图的操纵方法。二、实验要求:在现有的数据库上进行各种查询操作,对视图的创建、使用等操作。三、实验步骤:1、开始→程序→MicrosoftSQLServer→SQLServerManagementStudio。2、在“连接到服务器”对话框中,选择......
  • 数据采集与控制> 数字I/O卡 > PXI2371,PXI总线,离散量输入输出卡,每通道可通过跳线实现切换
    数据采集与控制 > 数字I/O卡 > PXI2371/2372/2373本章主要介绍237X的系统组成及基本特性,为用户整体了解237X的相关特性提供参考。产品简介237X板卡是本公司推出的一系列高密度离散量输入输出卡,每通道可通过跳线实现切换电源/开、电源/地、地/开三种输入状态选择,输入通......
  • PCI2363/PCIe2363/PXI2363/PXIe2363,工业级光电隔离DI/O卡,通道间隔离,支持24路漏极源极
    数据采集与控制 > 数字I/O卡 > 2363系列236x系列板卡是本公司推出的PCI、PCIe、PXI、PXIe四种总线的工业级光电隔离DI/DO卡,采用并行数字IO接口设计,支持多达48路I/O通道,并且通道与通道间隔离。输入包含可编程输入滤波器功能,以消除信号的毛刺/尖峰,使采集结果更精准。输出......
  • Matlab r2023a v23.2.0 解锁版安装步骤 (工程计算商业数学软件)
    前言Matlab(矩阵实验室)是全球领先的数学计算软件开发商美国MathWorks公司研发的一款面向科学与工程计算的高级语言的商业数学软件,集算法开发、数据分析、可视化和数值计算于一体的编程环境,其核心是仿真交互式矩阵计算,广泛应用于科学计算、数据分析、算法开发和绘图设计等......
  • 【日记】上班居然睡了一上午(230 字)
    正文昨天色到了很晚,早上没什么精神,于是睡了一个上午。在监控下面睡,只能说不愧是我。高中练就的无痕上课睡觉绝技居然在上班时也能派上用场。反洗钱系统今天卡到爆炸,这部分工作只能明天再做了。下午写了一篇文章。今天似乎也没做什么呢。晚上很想好好地在......
  • CSP历年复赛题-P9748 [CSP-J 2023] 小苹果
    原题链接:https://www.luogu.com.cn/problem/P9748题意解读:n个苹果,每天从第1个开始,每三个苹果拿走第一个,问几天拿完,最后一个苹果第几天拿走。解题思路:由于每三个苹果拿一个,每天拿走的苹果数量是⌈n/3⌉,即(n+2)/3n每天都要减去(n+2)/3,直到n为0,记录天数即可得到总天数最......
  • 多线程设计模式之Future模式
    在JDK中实现线程同步等待闭环(FutureTask/Future)中已经涉及到了Future模式,相对与多线程设计模式之WorkerThread模式有何异同呢?在多线程设计模式之WorkerThread模式中client和worker之间没有任何直接联系,即worker执行的结果client是不关心的;Future模式与之的差别就在于此线......
  • 赶紧收藏!2024 年最常见 20道设计模式面试题(七)
    上一篇地址:赶紧收藏!2024年最常见20道设计模式面试题(六)-CSDN博客十三、享元模式如何优化资源使用?享元模式(FlyweightPattern)是一种结构型设计模式,用于减少创建对象的数量,以减少内存占用和提高性能。这种模式通过共享多于一个对象共同使用的相同状态,来优化资源使用。享元模......
  • #c:键盘输入一个字符串判断它是不是回文 回文:123321
    小小案例仅供参考:/键盘输入一个字符串判断它是不是回文比如:12321这个就是回文#include<stdio.h>#include<string.h>voidtest01(){  charbuf[128]="";  printf("请输入一个字符串:\n");  fgets(buf,sizeof(buf),stdin);  buf[strlen(buf)-1]=0; ......