享元模式
2020-06-03 本文已影响0人
hangzhi
-
定义:
运用共享技术来有効地支持大量细粒度对象的复用。它通过共享已经存在的又橡来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。 -
特点:
- 相同对象只要保存一份,这降低了系统中对象的数量,从而降低了系统中细粒度对象给内存带来的压力。(优点)
- 为了使对象可以共享,需要将一些不能共享的状态外部化,这将增加程序的复杂性。(缺点)
- 读取享元模式的外部状态会使得运行时间稍微变长。(缺点)
-
通常适用场景:
- 系统中存在大量相同或相似的对象,这些对象耗费大量的内存资源。
- 大部分的对象可以按照内部状态进行分组,且可将不同部分外部化,这样每一个组只需保存一个内部状态。
-
demo代码:
- 享元
//抽象享元类 public interface Car { void make(int count); } //具体享元类 public class FruitCar implements Car { private String carType; public FruitCar(String carType){ this.carType=carType; System.out.println(carType + "车被创建"); } @Override public void make(int count) { System.out.println(carType + "车被使用"+count+"次"); } } //享元工厂类 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; } }
- 测试和结果
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); }