Вызов одноэлементного класса в абстрактном фабричном методе - PullRequest
0 голосов
/ 24 мая 2018

У меня есть класс с абстрактным фабричным методом следующим образом:

 public abstract class OpClass
    {
        public abstract IHou OperationInvoke(string opClass);
    }

    public class FactoryClass : OpClass
    {
        public override IHou OperationInvoke(string opClass)
        {
            if(opClass == "T")
            {
                //new Treasure();
            }

        }
    }

и конкретный класс "Сокровища" выглядит так:

 public interface IHou
    {
        void Operation(Player p, List<Player> lstPlayers);
    }

public sealed class Treasure : IHou
    {
        private static Treasure instance = null;
        private static readonly object padlock = new object();

        Treasure()
        {

        }

        public static Treasure Instance
        {
            get
            {
                lock (padlock)
                {
                    if (instance == null)
                    {
                        instance = new Treasure();
                    }
                    return instance;
                }
            }
        }

        public void Operation(Player p, List<Player> lstPlayers)
        {
            p.Points = p.Points + 200;

        }
    }

В моем основном методе я пытаюсьназывать его так:

Main()
{
    Player p = //Populate from db;
    List<Player> players = //populate from db 
    OpClass c = new FactoryClass();
    IHou output = c.OperationInvoke("T");
    output.Operation(p, players);
}

Но мне нужен единственный экземпляр класса "Сокровище" , поэтому у меня появилась идея изменить обычный "Сокровище" класс для одноэлементного класса.

Итак, как в этом сценарии как создать отдельный экземпляр класса Treasure, а также сохранить шаблон лиц?И если не представляется возможным реализовать лучшее решение, если добавляется количество конкретных классов, таких как Сокровище, Дом, Блоки и т. Д .?

Редактировать : Не подходит ли использование фабричного шаблоназдесь, как я понимаю, если у нас будет много классов с общим поведением, как в этом Сокровище, и скажем, что добавляется еще один класс " Дом ", который вычисляет точки другим способом, я позволю фабрике решатьчтобы вызвать какой экземпляр.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Просто верните экземпляр синглтона на заводе.

Ваша фабрика несет ответственность за знание того, как «сделать».В случае с Treasure существует только один экземпляр, поэтому Factory просто возвращает его.

Тот факт, что вы возвращаете общие или неразделенные экземпляры на основе ключа, делает ваш код похожим на мухи.Если никакой другой код не нужен для создания Treasure за пределами фабрики, вам не нужен Singleton.Вы можете принудительно создать экземпляры классов через фабрику, сделав их вложенными классами фабрики.

Так что сделайте Treasure вложенным классом фабрики с помощью частного конструктора.Или сделайте его закрытым вложенным классом и используйте метод factory для возврата абстрактной базы.

0 голосов
/ 24 мая 2018

вы можете использовать шаблон Flyweight для этого, в этом шаблоне вы будете хранить экземпляр в кеше или словаре и возвращать его из фабрики

с помощью реализации фабрики на основе обобщений, как показано ниже, вам не нужночтобы добавить больше случаев, он создаст класс, основанный на типе шаблона T. Вы можете посетить ссылку на статью ниже, чтобы иметь тот же король реализации.Шаблон

public class FlyWeidhtFactory
{
    Dictionary<string,IHou> dic = new Dictionary<string,IHou>();

    public IHou OperationInvoke<T>(string opClass)  where T: IHou 
    {
        Type type = typeof(T);
        string fullname = type.FullName;
        if(!dic.Contains(fullname)
        {
           Object obj = Activator.CreateInstance(type);
           dic[fullname] = (T)obj;  
           //no need of more cases 
        }
        return dic[opClass]; 
    }
}

гарантирует, что вы собираетесь создать много объектов, и благодаря вышеприведенной реализации вы уверены, что будет создан только один экземпляр вашего класса.нет необходимости идти по синглтон модели.

Сделайте ваш конкретный класс internal sealed, чтобы он не был виден снаружи вашей сборки.

Выше просто предложение, основанное на вашем вопросе.

Артикулы для заводского и летучего веса:

...