Приспособленец (Flyweight) :: Cетевой уголок Majestio

Приспособленец (Flyweight)


Приспособленец — это структурный паттерн проектирования, который позволяет вместить бóльшее количество объектов в отведённую оперативную память. Легковес экономит память, разделяя общее состояние объектов между собой, вместо хранения одинаковых данных в каждом объекте.

Применимость

Подробнее на 👉 refactoring.guru

UML-диаграмма

Пример реализации

#include <iostream>
#include <map>


// Интерфейс для приспособленца
class CarFlyweight {
 public:
  virtual void build(int uniqueId) = 0;
};

// Конкретная реализация приспособленца
class Car : public CarFlyweight {
 private:
  std::string model;

 public:
  Car(const std::string& carModel) : model(carModel) {}

  void build(int uniqueId) override {
    std::cout << "Строим автомобиль " << model
              << " с уникальным идентификатором " << uniqueId << std::endl;
  }
};

// Фабрика приспособленцев
class CarFactory {
 private:
  std::map<std::string, CarFlyweight*> cars;

 public:
  CarFlyweight* getCar(const std::string& model) {
    if (cars.find(model) == cars.end()) {
      cars[model] = new Car(model);
    }
    return cars[model];
  }
};

int main() {
  CarFactory factory;
  CarFlyweight* car1 = factory.getCar("Sedan");
  CarFlyweight* car2 = factory.getCar("SportCar");

  car1->build(1);
  car2->build(2);

  return 0;
}
Будет напечатано:
Строим автомобиль Sedan с уникальным идентификатором 1
Строим автомобиль SportCar с уникальным идентификатором 2
// Интерфейс для приспособленца
abstract class CarFlyweight {
  void build(int uniqueId);
}

// Конкретная реализация приспособленца
class Car implements CarFlyweight {
  String model;

  Car(this.model);

  void build(int uniqueId) {
    print('Строим автомобиль $model с уникальным идентификатором $uniqueId');
  }
}

// Фабрика приспособленцев
class CarFactory {
  Map<String, CarFlyweight> cars = {};

  CarFlyweight getCar(String model) {
    if (!cars.containsKey(model)) {
      cars[model] = Car(model);
    }
    return cars[model]!;
  }
}

void main() {
  CarFactory factory = CarFactory();
  CarFlyweight car1 = factory.getCar('Sedan');
  CarFlyweight car2 = factory.getCar('SportCar');

  car1.build(1);
  car2.build(2);
}
Будет напечатано:
Строим автомобиль Sedan с уникальным идентификатором 1
Строим автомобиль SportCar с уникальным идентификатором 2
Рейтинг: 0/5 - 0 голосов