diff options
Diffstat (limited to 'MorgSimulator/Factory/MorgFactory.cs')
| -rw-r--r-- | MorgSimulator/Factory/MorgFactory.cs | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/MorgSimulator/Factory/MorgFactory.cs b/MorgSimulator/Factory/MorgFactory.cs new file mode 100644 index 0000000..95ecbee --- /dev/null +++ b/MorgSimulator/Factory/MorgFactory.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace MorgSimulator.Factory +{ + public class MorgFactory : IMorgFactory + { + public Morg CreateMorg(int id, string type, int x, int y, string movement, string feeding) + { + var trimmedFeeding = feeding.Trim(); + var feedingParts = trimmedFeeding.Split(' '); + var movementStrategy = CreateMovementStrategy(movement); + var feedingStrategy = CreateFeedingStrategy(feedingParts[0]); + var preyTypes = ParsePreyTypes(feedingParts); + var morg = new Morg(id, (x, y), (0, 0)) + { + Type = type, + MovementStrategy = movementStrategy, + FeedingStrategy = feedingStrategy, + PreyTypes = preyTypes + }; + + return morg; + } + + public IMovementStrategy CreateMovementStrategy(string movementType) + { + return movementType.Trim() switch + { + "Paddles" => new MovementStrategyPaddles(), + "Oozes" => new MovementStrategyOozes(), + _ => throw new ArgumentException($"Unknown movement type: {movementType}") + }; + } + + public IFeedingStrategy CreateFeedingStrategy(string behavior) + { + return behavior switch + { + "Absorbs" => new FeedingStrategyAbsorbs(), + "Envelops" => new FeedingStrategyEnvelops(), + _ => throw new ArgumentException($"Unknown feeding type: {behavior}") + }; + } + + private static List<string> ParsePreyTypes(string[] feedingParts) + { + var preyTypes = new List<string>(); + + for (int i = 1; i < feedingParts.Length; i++) + { + var prey = feedingParts[i].Trim(); + + if (!string.IsNullOrEmpty(prey)) + preyTypes.Add(prey); + } + + return preyTypes; + } + } +} |