首页 > 编程语言 >Java学设计模式之享元模式

Java学设计模式之享元模式

时间:2024-05-10 09:24:02浏览次数:20  
标签:享元 Java color 对象 共享 设计模式 public 客户端

一、享元模式概念

1.1 什么是享元模式

享元模式是一种结构型设计模式,旨在通过共享对象来最大程度地减少内存使用和提高性能。在享元模式中,对象被设计成可共享的,以便在需要时能够被多个不同的上下文使用。

结构

享元模式通常包含以下几个要素:

  1. Flyweight(享元): 定义了共享对象的接口,包含了需要被共享的状态。通过这些接口,享元对象可以接受并作用于外部状态。

  2. ConcreteFlyweight(具体享元): 实现了享元接口,表示可被共享的具体对象。具体享元对象中包含了内部状态,而外部状态则由客户端在使用时传递给享元对象。

  3. UnsharedConcreteFlyweight(非共享具体享元): 不可被共享的具体对象,通常是一些不可复用的对象,其中包含了不适合被共享的状态。

  4. FlyweightFactory(享元工厂): 负责创建和管理享元对象。当客户端请求一个享元对象时,享元工厂负责检查是否已经有相应的享元对象存在,如果存在则返回已有的对象,如果不存在则创建一个新的享元对象并将其加入到享元池中。

  5. Client(客户端): 使用享元模式的客户端。客户端通常会维护一些外部状态,并在需要时将这些状态传递给享元对象。

二、享元模式代码

2.1 享元

public interface ChessPiece {
    void display(String position);
}

2.2 具体享元

public class ConcreteChessPiece implements ChessPiece {
    private String color;

    public ConcreteChessPiece(String color) {
        this.color = color;
    }

    @Override
    public void display(String position) {
        System.out.println("Chess piece color: " + color + ", position: " + position);
    }
}

2.3 享元工厂

public class ChessPieceFactory {
    private Map<String, ChessPiece> pieces = new HashMap<>();

    public ChessPiece getChessPiece(String color) {
        if (!pieces.containsKey(color)) {
            pieces.put(color, new ConcreteChessPiece(color));
        }
        return pieces.get(color);
    }
}

2.4 测试类

public class FlyweightPatternTest {
    public static void main(String[] args) {
        ChessPieceFactory factory = new ChessPieceFactory();
        ChessPiece whitePawn1 = factory.getChessPiece("white");
        whitePawn1.display("a2");

        ChessPiece whitePawn2 = factory.getChessPiece("white");
        whitePawn2.display("b2");

        ChessPiece blackPawn = factory.getChessPiece("black");
        blackPawn.display("a7");
    }
}

三、总结

享元模式的优点包括:

  • 大大减少了对象的数量,节省了内存空间。
  • 提高了系统的性能,因为共享对象可以被多个客户端同时使用。

缺点包括:

  • 需要对外部状态进行管理,可能会增加系统的复杂性。
  • 共享对象的状态改变可能会影响到其他使用该对象的客户端。

标签:享元,Java,color,对象,共享,设计模式,public,客户端
From: https://www.cnblogs.com/Linzj5950/p/18183540

相关文章

  • JDK源码阅读-------自学笔记(二十六)(java.util.Map 自定义讲解)
    一、简介Map就是用来存储“键(key)-值(value)”对的.通过键寻找value,所以键不能重复.数组的本质也是一种键值对,区别就是索引一般是数字,而Map的Key可以是任意对象(字符串,数字),相当于把数组的索引范围扩的更大,使用更方便.实际开发中较为常用.二、Map的常用方法实例(1......
  • 设计模式之七大原则
    设计模式之七大原则(一)——单一职责原则、开放-关闭原则_系统设计原则单一职责隔离-CSDN博客一、设计模式的目的设计模式的目的是为了提高代码重用性、可读性、可扩展性、可靠性,使得程序呈现出高内聚、低耦合的特性。二、设计模式的七大原则我们在设计一些设计模式时,一般遵循......
  • 设计模式详解
    本文结构图:除了类本身,设计模式更强调多个类/对象之间的关系和交互过程——比接口/类复用的粒度更大创建型模式(Creationalpatterns)工厂方法模式(FactoryMethodpattern)工厂方法也被称作虚拟构造器(VirtualConstructor)即定义一个用于创建对象的接口,让子类类决定实例化......
  • 设计模式03----构造者模式
    构造者模式:是一种创建型设计模式,是将一个对象拆分成多个部件分别进行构造然后组合成为一个整体的设计模式产品(Product):被构建的复杂对象,通常包含多个组成部件,例如一个需要配置的汽车对象。抽象建造者(Builder):一个接口,定义了构建产品各个部件的方法。具体建造者(ConcreteBuilde......
  • JAVA_WEB复习之请求响应
    简单参数请求:原始的方法,我们需要通过servlet中提供的api,HttpServletRequest(请求对象),获取请求的相关信息。比如获取请求参数:当tomcat接收到请求时,它会把请求的信息封装httpservletrequest到对象中。而在Springboot的环境,原始的API进行了封装,接收参数的形式更加简单。如果是简单......
  • Springboot项目的jar包的运行方式以及使用yum安装java后忘记了位置
    SpringBoot项目打包后的jar的部署方式这里我写了五种部署方式1.直接启动java-jarxxx.jar这种方式就只适合自己在测试时用一下,关闭会话就能停止运行属实是方便。2.后台启动java-jarxxx.jar&在后台静默启动,同样关闭会话也会停止,优点是和上面一样,日志是打印在窗口的3......
  • java9
    小练习:publicclasstest1{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);System.out.println("请输入当前机票的原价");intticket=sc.nextInt();System.out.println("请输入月份");int......
  • Java根据数学公式计算出结果
    importjavax.script.ScriptEngine;importjavax.script.ScriptEngineManager;importjavax.script.ScriptException;publicclassTest{publicstaticvoidmain(String[]args){//年均充放电量=(E2*H4*G4*0.95*0.86)*0.871/10000Stringexpressi......
  • 【java】Java之关于基本数据类型和引用数据类型的存放位置
    1、基本数据类型存放在哪?基本类型的变量存在栈里或者堆里不是由"大小可知,生存期可知"就能确定了。关键是上下文。比如:123voidmethod(){    inta=3;}这自然是存在栈里的。局部方法嘛。而:123classTest{    inta=3;}......
  • Java学设计模式之桥接模式
    一、桥接模式概念1.1什么是桥接模式桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化。桥接模式通过将抽象部分和实现部分分离来解决多维度变化的问题,从而提高了系统的灵活性和可扩展性。结构桥接模式通常由以下几个部分组成:Abstraction(抽象类......