Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //http://www.codedomain.de
- using System;
- using System.Collections.Generic;
- namespace StrategySelector {
- public enum InstanceType {
- Singelton,
- Instance
- }
- public class StrategySelector<T> {
- private readonly Dictionary<Enum, InstanceType> _instanceControl = new Dictionary<Enum, InstanceType>();
- private readonly Dictionary<Enum, T> _singeltonControl = new Dictionary<Enum, T>();
- private readonly Dictionary<Enum, Type> _typeControl = new Dictionary<Enum, Type>();
- public bool RegisterStrategy(Enum value, Type strategy, InstanceType instanceType) {
- if (_instanceControl.ContainsKey(value)) {
- return false;
- }
- _instanceControl[value] = instanceType;
- _typeControl[value] = strategy;
- return true;
- }
- public T SelectStrategy(Enum value) {
- if (!_instanceControl.ContainsKey(value)) {
- throw new Exception("Strategy not available");
- }
- if (_instanceControl[value] == InstanceType.Instance) {
- return (T) Activator.CreateInstance(_typeControl[value]);
- }
- if (_singeltonControl.ContainsKey(value)) {
- return _singeltonControl[value];
- }
- lock (_instanceControl) {
- if (!_singeltonControl.ContainsKey(value)) {
- _singeltonControl[value] = (T) Activator.CreateInstance(_typeControl[value]);
- }
- }
- return _singeltonControl[value];
- }
- }
- }
- // here the an usage example
- using System;
- using StrategySelector;
- namespace ConsoleStrategy {
- internal interface IStrategy {
- void DoSomething();
- }
- internal class MyStrategy1 : IStrategy {
- public void DoSomething() {
- Console.WriteLine("Strategy1");
- }
- }
- internal class MyStrategy2 : IStrategy {
- public void DoSomething() {
- Console.WriteLine("Strategy2");
- }
- }
- internal class Program {
- public enum Strategies {
- Strategy1,
- Strategy2
- };
- private static void Main(string[] args) {
- var strategySelector = new StrategySelector<IStrategy>();
- strategySelector.RegisterStrategy(Strategies.Strategy1, typeof (MyStrategy1), InstanceType.Instance);
- strategySelector.RegisterStrategy(Strategies.Strategy2, typeof (MyStrategy2), InstanceType.Singelton);
- strategySelector.SelectStrategy(Strategies.Strategy1).DoSomething();
- strategySelector.SelectStrategy(Strategies.Strategy2).DoSomething();
- strategySelector.SelectStrategy(Strategies.Strategy1).DoSomething();
- strategySelector.SelectStrategy(Strategies.Strategy2).DoSomething();
- System.Console.ReadLine();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment