定义:

  • 运用共享技术来有効地支持大量细粒度对象的复用。它通过共享已经存在的又橡来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。

    特点:

  • 相同对象只要保存一份,这降低了系统中对象的数量,从而降低了系统中细粒度对象给内存带来的压力。(优点)

  • 为了使对象可以共享,需要将一些不能共享的状态外部化,这将增加程序的复杂性。(缺点)
  • 读取享元模式的外部状态会使得运行时间稍微变长。(缺点)

    通常适用场景:

  • 系统中存在大量相同或相似的对象,这些对象耗费大量的内存资源。

  • 大部分的对象可以按照内部状态进行分组,且可将不同部分外部化,这样每一个组只需保存一个内部状态。

    demo代码:

  • 享元 ```java //抽象享元类 public interface Car { void make(int count); }

//具体享元类 public class FruitCar implements Car {

  1. private String carType;
  2. public FruitCar(String carType){
  3. this.carType=carType;
  4. System.out.println(carType + "车被创建");
  5. }
  6. @Override
  7. public void make(int count) {
  8. System.out.println(carType + "车被使用"+count+"次");
  9. }

}

//享元工厂类 public class FruitCarFactory{

private Map<String,Car> fruitCarMap= new ConcurrentHashMap<>();

public Car createFruitCar(String carType){
    Car car = fruitCarMap.get(carType);
    if(car ==null){
        car=new FruitCar(carType);
        fruitCarMap.put(carType,car);
    }else {
        System.out.println("已存在"+ carType+"车,成功获取");
    }
    return car;
}

}


- 测试和结果
```java
public static  void main(String[] args) {
    FruitCarFactory fruitCarFactory =new FruitCarFactory();
    Car a1 = fruitCarFactory.createFruitCar("A类");
    a1.make(1);
    Car a2 = fruitCarFactory.createFruitCar("A类");
    a2.make(2);
    Car a3 = fruitCarFactory.createFruitCar("A类");
    a3.make(3);
    Car b1 = fruitCarFactory.createFruitCar("B类");
    b1.make(1);
    Car b2 = fruitCarFactory.createFruitCar("B类");
    b2.make(2);
  }

享元模式 - 图1