using System.Collections.Generic;
public static void Main()
var trafficLight = new TrafficLight();
trafficLight.StartWorking();
public enum TrafficLightStateType
public interface ITrafficLightState
TrafficLightStateType Type { get; }
ITrafficLightState NextColor();
public class TrafficLightStateFactory
private Dictionary<TrafficLightStateType, ITrafficLightState> states = new Dictionary<TrafficLightStateType, ITrafficLightState>();
private static TrafficLightStateFactory _instance;
public static TrafficLightStateFactory GetInstance()
_instance = new TrafficLightStateFactory();
public ITrafficLightState GetState(TrafficLightStateType type)
if(!states.ContainsKey(type))
case TrafficLightStateType.Red:
states[type] = new TrafficLightRedState();
case TrafficLightStateType.Orange:
states[type] = new TrafficLightOrangeState();
case TrafficLightStateType.Green:
states[type] = new TrafficLightGreenState();
public abstract class TrafficLightState : ITrafficLightState
protected TrafficLightStateFactory trafficLightStateFactory;
public TrafficLightState()
trafficLightStateFactory = TrafficLightStateFactory.GetInstance();
public abstract TrafficLightStateType Type { get; }
public abstract bool CanDrive();
public abstract ITrafficLightState NextColor();
public class TrafficLightRedState : TrafficLightState
public override TrafficLightStateType Type => TrafficLightStateType.Red;
public override bool CanDrive()
Console.WriteLine($"{Type} - You can't drive, please wait.");
public override ITrafficLightState NextColor()
return trafficLightStateFactory.GetState(TrafficLightStateType.Orange);
public class TrafficLightOrangeState : TrafficLightState
public override TrafficLightStateType Type => TrafficLightStateType.Orange;
public override bool CanDrive()
Console.WriteLine($"{Type} - Please get ready to go soon.");
public override ITrafficLightState NextColor()
return trafficLightStateFactory.GetState(TrafficLightStateType.Green);
public class TrafficLightGreenState : TrafficLightState
public override TrafficLightStateType Type => TrafficLightStateType.Green;
public override bool CanDrive()
Console.WriteLine($"{Type} - Go go go.");
public override ITrafficLightState NextColor()
return trafficLightStateFactory.GetState(TrafficLightStateType.Red);
public class TrafficLight
private ITrafficLightState _state;
private bool _isWorking = false;
_state = new TrafficLightRedState();
public void StartWorking()
public void StopWorking()
_state = _state.NextColor();
return _state.CanDrive();