public static int GetCookingTime(ProductType productType) { lock (_locker) { if (_instances.TryGetValue(productType, out AbstractProduct instance)) { return(instance.CookingTimeInSeconds); } instance = AbstractProductCreator.GetCreator(productType).Create(); _instances.Add(productType, instance); return(instance.CookingTimeInSeconds); } }
private async Task <AbstractCompletedOrder> PreparedOrder(AbstractOrder order) { int allCoocingTime = order.ProductTypes.Sum(productType => ProductsCookingTimeInformator.GetCookingTime(productType)); var cookingEmulator = Task.Delay(TimeSpan.FromSeconds(allCoocingTime)); // Моделирует приготовление заказа LinkedList <AbstractProduct> completedProducts = new LinkedList <AbstractProduct>(); foreach (var productType in order.ProductTypes) { completedProducts.AddLast(AbstractProductCreator.GetCreator(productType).Create()); } AbstractCompletedOrder completedOrder = new CompletedOrder(order.Number, completedProducts); await cookingEmulator; return(completedOrder); }