Стратегии и модели Flyweight - PullRequest
       5

Стратегии и модели Flyweight

1 голос
/ 14 января 2010

Я читал, что «Объекты стратегии часто дают хороший вес» (из Элементы шаблонов проектирования многоразового объектно-ориентированного программного обеспечения ), и мне интересно, как это можно реализовать. Я не нашел ни одного примера в интернете.

Правильно ли указан код (C #) ниже, следуя этой идее?

Спасибо!

using System;
using System.Collections.Generic;

namespace StrategyFlyweight
{
    class Program
    {
        static void Main(string[] args)
        {
            Client client = new Client();
            for(int i = 1; i <= 10;i++)
            {
                client.Execute(i);
            }
            Console.ReadKey();
        }
    }

    public interface IStrategy
    {
        void Check(int number);
    }

    public class ConcreteStrategyEven : IStrategy
    {
        public void Check(int number)
        {
            Console.WriteLine("{0} is an even number...", number);
        }
    }

    public class ConcreteStrategyOdd : IStrategy
    {
        public void Check(int number)
        {
            Console.WriteLine("{0} is an odd number...", number);
        }
    }

    public class FlyweightFactory
    {
        private Dictionary<string, IStrategy> _sharedObjects = new Dictionary<string, IStrategy>();

        public IStrategy GetObject(int param)
        {
            string key = (param % 2 == 0) ? "even" : "odd";

            if (_sharedObjects.ContainsKey(key))
                return _sharedObjects[key];
            else
            {
                IStrategy strategy = null;
                switch (key)
                {
                    case "even":
                        strategy = new ConcreteStrategyEven();
                        break;
                    case "odd":
                        strategy = new ConcreteStrategyOdd();
                        break;
                }
                _sharedObjects.Add(key, strategy);
                return strategy;
            }
        }
    }

    public class Client
    {
        private IStrategy _strategy;
        private FlyweightFactory _flyweightFactory = new FlyweightFactory();

        public void Execute(int param)
        {
            ChangeStrategy(param);
            _strategy.Check(param);
        }

        private void ChangeStrategy(int param)
        {
            _strategy = _flyweightFactory.GetObject(param);
        }
    }
}

1 Ответ

7 голосов
/ 14 января 2010

Я думаю, что для правильной реализации шаблона flyweight здесь ваш фабричный метод должен всегда возвращать один и тот же экземпляр конкретной стратегии (например, ConcreteStrategyEven), а не каждый раз создавать новый экземпляр.

Если я не ошибаюсь, смысл в том, что объекты Стратегии создают хорошие весы Flyweights, заключается в том, что они часто не содержат никакого состояния (поскольку они представляют алгоритмы, а не объекты) и могут использоваться повторно.

Вот ссылка на пример фабрики Flyweight: http://www.java2s.com/Code/Java/Design-Pattern/FlyweightFactory.htm. Обратите внимание на эту часть, в частности:

  public synchronized FlyweightIntr getFlyweight(String divisionName) {
    if (lstFlyweight.get(divisionName) == null) {
      FlyweightIntr fw = new Flyweight(divisionName);
      lstFlyweight.put(divisionName, fw);
      return fw;
    } else {
      return (FlyweightIntr) lstFlyweight.get(divisionName);
    }
  }

Здесь в заводском методе новый FlyweightIntr инициализируется только в том случае, если правильный не доступен; в противном случае он извлекается из lstFlyweight.

...