描述
享元模式是一种设计模式,它旨在减少程序中创建对象的数量,以提高程序的性能和效率。在享元模式中,对象被分为两种类型:内部状态和外部状态。内部状态是对象的共享部分,外部状态是对象的可变部分。
享元模式的主要思想是共享对象,即多个对象可以共享同一个对象实例,从而减少对象的创建和销毁次数。这种共享对象的方式可以通过对象池来实现,即将对象存储在池中,需要使用时从池中获取,使用完后放回池中。
使用享元模式可以大大减少程序的内存使用和创建对象的开销,特别是当需要创建大量对象时。它适用于需要创建大量相似对象的场景,例如图像处理或游戏开发中的角色对象。
实现
抽象连接
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);
}
}
实验结果
使用场景
-
需要创建大量的对象,这些对象具有相似或相同的属性。
-
对象的状态可以分为内部状态和外部状态,其中内部状态指对象的共享部分,外部状态指对象的变化部分。在对象创建后,内部状态不再改变,而外部状态可以动态改变。
-
内部状态可以被共享的对象,需要提供一个全局访问点来访问这些对象,这个全局访问点可以是一个工厂方法。
具体场景
- 文字编辑器中的字体和格式,可以使用享元模式来共享相同字体和格式的属性。
- 棋盘游戏中的棋子,可以使用享元模式来共享相同的属性(如颜色、形状、大小等)。
- 操作系统中的进程和线程,可以使用享元模式来共享相同的属性(如进程名、线程名、状态等)。
- 电子商务中的商品,可以使用享元模式来共享相同的属性(如商品名称、价格、图片等)。