document.write('
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. //http://www.codedomain.de
  2.  
  3. using System;
  4. using System.Collections.Generic;
  5.  
  6. namespace StrategySelector {
  7.    public enum InstanceType {
  8.       Singelton,
  9.       Instance
  10.    }
  11.  
  12.    public class StrategySelector<T> {
  13.       private readonly Dictionary<Enum, InstanceType> _instanceControl = new Dictionary<Enum, InstanceType>();
  14.       private readonly Dictionary<Enum, T> _singeltonControl = new Dictionary<Enum, T>();
  15.       private readonly Dictionary<Enum, Type> _typeControl = new Dictionary<Enum, Type>();
  16.  
  17.       public bool RegisterStrategy(Enum value, Type strategy, InstanceType instanceType) {
  18.          if (_instanceControl.ContainsKey(value)) {
  19.             return false;
  20.          }
  21.          _instanceControl[value] = instanceType;
  22.          _typeControl[value] = strategy;
  23.          return true;
  24.       }
  25.  
  26.       public T SelectStrategy(Enum value) {
  27.          if (!_instanceControl.ContainsKey(value)) {
  28.             throw new Exception("Strategy not available");
  29.          }
  30.          if (_instanceControl[value] == InstanceType.Instance) {
  31.             return (T) Activator.CreateInstance(_typeControl[value]);
  32.          }
  33.          if (_singeltonControl.ContainsKey(value)) {
  34.             return _singeltonControl[value];
  35.          }
  36.          lock (_instanceControl) {
  37.             if (!_singeltonControl.ContainsKey(value)) {
  38.                _singeltonControl[value] = (T) Activator.CreateInstance(_typeControl[value]);
  39.             }            
  40.          }
  41.          return _singeltonControl[value];
  42.       }
  43.    }
  44. }
  45.  
  46. // here the an usage example
  47.  
  48. using System;
  49. using StrategySelector;
  50.  
  51. namespace ConsoleStrategy {
  52.    internal interface IStrategy {
  53.       void DoSomething();
  54.    }
  55.  
  56.    internal class MyStrategy1 : IStrategy {
  57.       public void DoSomething() {
  58.          Console.WriteLine("Strategy1");
  59.       }
  60.    }
  61.  
  62.    internal class MyStrategy2 : IStrategy {
  63.       public void DoSomething() {
  64.          Console.WriteLine("Strategy2");
  65.       }      
  66.    }
  67.  
  68.    internal class Program {
  69.      
  70.       public enum Strategies {
  71.          Strategy1,
  72.          Strategy2
  73.       };
  74.      
  75.       private static void Main(string[] args) {
  76.          var strategySelector = new StrategySelector<IStrategy>();
  77.          strategySelector.RegisterStrategy(Strategies.Strategy1, typeof (MyStrategy1), InstanceType.Instance);
  78.          strategySelector.RegisterStrategy(Strategies.Strategy2, typeof (MyStrategy2), InstanceType.Singelton);
  79.          strategySelector.SelectStrategy(Strategies.Strategy1).DoSomething();
  80.          strategySelector.SelectStrategy(Strategies.Strategy2).DoSomething();
  81.          strategySelector.SelectStrategy(Strategies.Strategy1).DoSomething();
  82.          strategySelector.SelectStrategy(Strategies.Strategy2).DoSomething();
  83.          System.Console.ReadLine();
  84.       }
  85.    }
  86. }
');