享元模式(设计模式详解)

描述

享元模式是一种设计模式,它旨在减少程序中创建对象的数量,以提高程序的性能和效率。在享元模式中,对象被分为两种类型:内部状态和外部状态。内部状态是对象的共享部分,外部状态是对象的可变部分。

享元模式的主要思想是共享对象,即多个对象可以共享同一个对象实例,从而减少对象的创建和销毁次数。这种共享对象的方式可以通过对象池来实现,即将对象存储在池中,需要使用时从池中获取,使用完后放回池中。

使用享元模式可以大大减少程序的内存使用和创建对象的开销,特别是当需要创建大量对象时。它适用于需要创建大量相似对象的场景,例如图像处理或游戏开发中的角色对象。

实现

抽象连接

public interface Connector {
    void connect();
}

连接实现

public class MysqlConnector implements Connector{
    @Override
    public void connect() {
        System.out.println("Connect to Mysql");
    }
}
public class OracleConnector implements Connector{
  @Override
  public void connect() {
    System.out.println("Connect to Oracle");
  }
}

享元对象

public class FlyWeight {
  private final Map<String,Connector> connectorMap;
  public FlyWeight(){
    connectorMap = new HashMap<>();
  }

  public Connector getConnnect(String key){
    Connector connector = connectorMap.get(key);
    if(null == connector){
      if(key.equals("mysql")){
        connectorMap.put("mysql",new MysqlConnector());
      }else if(key.equals("oracle")){
        connectorMap.put("oracle",new OracleConnector());
      }
    }
       connector = connectorMap.get(key);
    return connector;
  }
}

客户端

public class Client {
  public static void main(String[] args) {
    FlyWeight flyWeight = new FlyWeight();
    Connector mysql1 = flyWeight.getConnnect("mysql");
    System.out.println(mysql1);
    Connector mysql2 = flyWeight.getConnnect("mysql");
    System.out.println(mysql2);
    System.out.println(mysql1 == mysql2);
  }
}
实验结果

在这里插入图片描述

使用场景

  • 需要创建大量的对象,这些对象具有相似或相同的属性。

  • 对象的状态可以分为内部状态和外部状态,其中内部状态指对象的共享部分,外部状态指对象的变化部分。在对象创建后,内部状态不再改变,而外部状态可以动态改变。

  • 内部状态可以被共享的对象,需要提供一个全局访问点来访问这些对象,这个全局访问点可以是一个工厂方法。

具体场景

  • 文字编辑器中的字体和格式,可以使用享元模式来共享相同字体和格式的属性。
  • 棋盘游戏中的棋子,可以使用享元模式来共享相同的属性(如颜色、形状、大小等)。
  • 操作系统中的进程和线程,可以使用享元模式来共享相同的属性(如进程名、线程名、状态等)。
  • 电子商务中的商品,可以使用享元模式来共享相同的属性(如商品名称、价格、图片等)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值