Java享元模式详解(角色实例及应用场景)

Java享元模式详解(角色实例及应用场景)-mikechen

Java享元模式是常用的Java设计模式,下面我重点详解Java享元模式的角色实现与应用场景@mikechen

Java享元模式定义

Java享元模式是一种结构型设计模式,旨在通过共享对象来减少内存使用和对象创建的数量。

享元模式的主要思想是:对于大量相似的对象,只创建一次,并在需要时共享使用。

通过共享对象,可以减少内存使用和对象创建的数量,从而提高系统的性能和效率。

 

Java享元模式应用场景

Java享元模式适用于:当需要创建大量相似的对象时,使用享元模式可以减少内存使用和对象创建的数量,提高系统性能和效率。

Java享元模式的应用场景,主要包含如下4类:

  1. 文字编辑器:当需要在文本编辑器中创建大量相似的字母或数字时,可以使用享元模式来共享相同的字母或数字对象,减少内存使用和对象创建的数量。
  2. 游戏中的角色:当需要在游戏中创建大量相似的角色时,可以使用享元模式来共享相同的角色对象,减少内存使用和对象创建的数量。
  3. Web应用中的缓存:当需要在Web应用中缓存大量相似的对象时,可以使用享元模式来共享相同的对象,减少内存使用和对象创建的数量。
  4. 数据库连接池:当需要在应用中管理大量数据库连接时,可以使用享元模式来共享相同的连接对象,减少内存使用和连接创建的数量。

 

Java中享元模式角色

Java中享元模式的主要角色,如下图所示:

Java享元模式详解(角色实例及应用场景)-mikechen

主要包含4大角色:

  1. 享元接口(Flyweight):定义了可以被共享的方法,通常是一个接口或抽象类。
  2. 具体享元类(ConcreteFlyweight):实现享元接口,包含内部状态。内部状态在享元对象创建后就不会再改变。
  3. 享元工厂类(FlyweightFactory):负责创建和管理享元对象,保证享元对象的共享和复用。
  4. 客户端(Client):使用享元工厂来获取享元对象,并传递需要的外部状态。外部状态在客户端使用享元对象时传递,不会被共享。

 

Java享元模式实现例子

在Java中实现享元模式实现,需要以下几个步骤:

  1. 定义享元接口(Flyweight),包括可以被共享的方法(如操作共享对象的方法)。
  2. 创建享元类(ConcreteFlyweight),实现享元接口,并包含内部状态。
  3. 创建享元工厂类(FlyweightFactory),用于管理享元对象的创建和共享。
  4. 在客户端代码中,使用享元工厂来获取享元对象,并传递需要的外部状态。

详细使用示例,如下:

// 享元接口
public interface Shape {
    void draw();
}

// 具体享元类
public class Circle implements Shape {
    private String color;
    
    public Circle(String color) {
        this.color = color;
    }
    
    @Override
    public void draw() {
        System.out.println("Drawing a " + color + " circle.");
    }
}

// 享元工厂类
public class ShapeFactory {
    private static final Map<String, Shape> shapes = new HashMap<>();
    
    public static Shape getCircle(String color) {
        Circle circle = (Circle)shapes.get(color);
        
        if (circle == null) {
            circle = new Circle(color);
            shapes.put(color, circle);
            System.out.println("Creating a new " + color + " circle.");
        } else {
            System.out.println("Reusing existing " + color + " circle.");
        }
        
        return circle;
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Shape redCircle = ShapeFactory.getCircle("red");
        redCircle.draw();
        
        Shape blueCircle = ShapeFactory.getCircle("blue");
        blueCircle.draw();
        
        Shape greenCircle = ShapeFactory.getCircle("green");
        greenCircle.draw();
        
        Shape redCircle2 = ShapeFactory.getCircle("red");
        redCircle2.draw();
    }
}

在上面的代码中:

  1. Circle类是享元类,用于维护圆的内部状态(颜色);
  2. ShapeFactory是享元工厂类,用于创建和管理共享的Circle对象;
  3. 在客户端代码中,使用ShapeFactory来获取Circle对象,并传递需要的外部状态(颜色);
  4. 通过共享Circle对象,可以减少内存使用和对象创建的数量。

以上就是Java享元模式详解,更多设计模式请查看:Java设计模式:23种设计模式(万字图文全面总结)

陈睿mikechen

十余年BAT架构经验,资深技术专家,就职于阿里、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法