// предоставляет способ создания составного объекта class PizzaBuilder { late String _crust; int _diameter; late Set _toppings; PizzaBuilder(this._diameter); String get crust => _crust; set crust(String newCrust) => _crust = newCrust; int get diameter => _diameter; set diameter(int newDiameter) => _diameter = newDiameter; Set get toppings => _toppings; set toppings(Set newToppings) { _toppings = newToppings; _addCheese(); } void _addCheese() => _toppings.add("сыр"); Pizza build() { return Pizza(this); } } class Pizza { late String _crust; late int _diameter; late Set _toppings; Pizza(PizzaBuilder builder) { _crust = builder.crust; _diameter = builder.diameter; _toppings = builder.toppings; } String get crust => _crust; int get diameter => _diameter; String get toppings => _stringifiedToppings(); String _stringifiedToppings() { var stringToppings = _toppings.join(", "); var lastComma = stringToppings.lastIndexOf(","); var replacement = ",".allMatches(stringToppings).length > 1 ? ", и" : " и"; return stringToppings.replaceRange(lastComma, lastComma + 1, replacement); } @override String toString() { return "Пицца с $_diameter\" диметром с $_crust корочкой. Ингридиенты: $toppings"; } } void main() { var pizzaBuilder = PizzaBuilder(8); pizzaBuilder.crust = "хрустящей"; pizzaBuilder.toppings = Set.from(["пеперони"]); var plainPizza = Pizza(pizzaBuilder); print("Заказана $plainPizza."); pizzaBuilder.crust = "сырной"; pizzaBuilder.diameter = 10; pizzaBuilder.toppings = Set.from(["ананасы"]); var ananasPizza = pizzaBuilder.build(); print("Заказана $ananasPizza!"); }