Зачем мне нужен шаблон проектирования Singleton? - PullRequest
2 голосов
/ 27 января 2009

Я пытаюсь выучить шаблон проектирования, но действительно очень сложно понять основную идею OOD. Я создал свое программное обеспечение с классическим методом. С другой стороны, я хочу изучить OOD. Зачем мне нужен синглтон и другие? Я написал простую программу: одна из них классическая (мой стиль), другая - синглтон. Пожалуйста, научите меня, зачем мне синглтон. мой метод лучше и понятнее :))

мой стиль: (C #)


  public partial class Singletonsuz : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Loadbalancer balancer = new Loadbalancer();

        for (int i = 0 ; i < 15 ; i++)
        {
            string server = balancer.Server;
            Response.Write("Dispatch Request to: " + server);
        }
    }
}
class Loadbalancer
{
    private List<string> _servers = new List<string>();
    private Random _random = new Random();
    public Loadbalancer()
        {
            _servers.Add("ServerI");
            _servers.Add("ServerII");
            _servers.Add("ServerIII");
            _servers.Add("ServerIV");
            _servers.Add("ServerV");
        }
    public string Server
    {
        get
        {
            int r = _random.Next(_servers.Count);
            return _servers[r].ToString();
        }
    }
}

SINGLETON:


    public partial class SingletonDP2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            LoadBalancer balancer = LoadBalancer.GetLoadBalancer();
            for (int i = 0; i < 15; i++)
            {
                string server = balancer.Server;
                Response.Write("Dispatch Request to: " + server );
            }
        }

        class LoadBalancer
        {
            private static LoadBalancer _instance;
            private List<string> _servers = new List<string>();
            private Random _random = new Random();

            private static object syncLock = new object();
            protected LoadBalancer()
            {
                _servers.Add("ServerI");
                _servers.Add("ServerII");
                _servers.Add("ServerIII");
                _servers.Add("ServerIV");
                _servers.Add("ServerV");
            }

            public static LoadBalancer GetLoadBalancer()
            {
                if (_instance == null)
                {
                    lock (syncLock)
                    {
                        if (_instance == null)
                        {
                            _instance = new LoadBalancer();
                        }
                    }
                }
                return _instance;
            }

            public string Server
            {
                get
                {
                    int r = _random.Next(_servers.Count);
                    return _servers[r].ToString();
                }
            }
        }
    }

Ответы [ 10 ]

28 голосов
/ 27 января 2009

Шаблоны проектирования не являются дизайном или разработкой методология . Это словарь : они помогают вводить имена в повторяющиеся шаблоны, встречающиеся в программных архитектурах. Исходя из моего опыта, разработка программного обеспечения для шаблонов FROM заканчивается сложным программным обеспечением с множеством одноцелевых классов, что увеличивает количество вещей, которые должен иметь в виду программист (а разработка программного обеспечения достаточно сложна, чтобы избежать заполнения вашего мозга шумом). ).

Однако шаблоны проектирования очень пригодятся на более позднем этапе. Всегда начинайте с конкретной проблемы и предметной области, пытайтесь найти решения и выявить закономерности в процессе. Не начинайте с шаблонов, пытаясь втиснуть в них вашу проблему. Знание наиболее распространенных шаблонов является обязательным, поскольку оно облегчает общение между программистами (будь то разработчики или пользователи библиотеки) и способствует распространению передового опыта.

Например, предположим, что ваша проблема связана с наборами данных. В какой-то момент вы создали свои структуры данных и алгоритмы. Теперь вам (или кому-то еще) необходимо получить доступ к своим данным на более высоком уровне. Это типичный случай, когда могут применяться шаблоны Iterator или Visitor. Так было сделано в C ++ STL, где все классы коллекции понимают итераторы. Однако вам не нужно заранее думать о шаблонах, которые вы можете или не можете применять здесь или там, всегда есть время для рефакторинга, как только шаблоны или потребности были выявлены.

Шаблоны проектирования изначально исходят из зданий и архитектуры, которые во многих отношениях очень похожи на разработку программного обеспечения. По моему опыту, лучший способ понять ДП - это аналогия с архитектурой: программное обеспечение - это здание, шаблоны - это способ организации архитектурных элементов: окна, двери, коридоры, лестницы, освещение ... Архитекторы не думают об элементах, которые они хочу использовать, но подумайте о том эффекте, который они хотят получить. Например, архитектор может подумать: эта лестница нуждается в свете. Чтобы достичь этого, он может использовать окна, окна в крыше, стеклянные блоки, искусственное освещение и т. Д., В соответствии с архитектурными ограничениями, строительными нормами, вкусом своего клиента и т. Д. Он не выбирает произвольно элементы, прежде чем думать о проблеме, которую пытается решить. решить, если он не пытается достичь эффекта или стиля. Более того, если на рынке появится другое решение (например, отражающие туннели солнечного света), он может включить его в доступные шаблоны проектирования для своих будущих проектов. OTOH, если он привык думать о решениях, прежде чем думать о проблемах, он рискует пропустить альтернативные решения, усложнить проблему или не решить ее вообще.

Здесь вы использовали шаблон Singleton для того, что выглядит как глобальный объект, требующий динамической инициализации. В этом случае синглтон является приемлемым решением. Однако иногда вам потребуются более сложные решения из-за внешних ограничений (например, вам нужно инициализировать объекты в определенном порядке), и Singleton больше не подходит. В противном случае объекту потребуется только статическая инициализация, а простая глобальная переменная будет соответствовать вашим потребностям.

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

10 голосов
/ 27 января 2009

Вам не нужны шаблоны. Что вам нужно, так это решения конкретной проблемы. Шаблоны - это просто общие решения известных проблем, и поэтому они считаются хорошими и работающими решениями.

Проблема с шаблонами заключается в том, что вы легко можете найти решение проблемы. то есть вы начинаете искать шаблон, который подходит к проблеме, когда вам следует подумать об обратном: подумайте о проблеме, а затем попытайтесь найти соответствие вашего решения шаблону.

Когда у тебя молоток, все выглядит как гвоздь ...

5 голосов
/ 27 января 2009

Синглтоны часто просто используются, чтобы оправдать существование какого-то глобального состояния.

Если у вас есть глобальное состояние, примите его и не чувствуете необходимости оборачивать его в шаблон, подобный одиночному, за исключением, возможно, следующих ограниченных обстоятельств:

Вы представляете это глобальное состояние из библиотеки.

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

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

Это действительно просто Фабрика, которую вы сейчас внедряете просто

Таким образом, «сокрытие» конструкции является важной частью, а не глобальным характером возвращаемого значения.

В тех случаях, когда потребители класса являются частью одного и того же процесса сборки (т. Е. Если вы каким-либо образом измените класс, затронутый код будет непосредственно затронут в следующей сборке), тогда необходимо выполнить это перенос, чтобы позволить изменение Это спорный вопрос, так как вы можете просто изменить его напрямую, если это будет необходимо. Это приложение, которое вам не нужно.

5 голосов
/ 27 января 2009

Шаблон Singleton широко признан как не совсем шаблон. Это больше похоже на пример того, как можно представить шаблон.

Вы можете обнаружить, что более универсальный шаблон, такой как Visitor , более полезен.

1 голос
/ 27 января 2009

Шаблон Singleton - это официально признанный способ создания чего-то похожего на глобальные переменные в современных языках ООП. Это предотвращает конфликты имен глобальных переменных и т. Д., Поскольку они изолированы от класса, и поэтому дублирующие имена классов легче избежать (поскольку ваш компилятор будет ошибаться). Также проще создать объект с помощью «отложенной реализации»: вы можете подождать, пока объект понадобится в первый раз для его создания, в функции singleton. Это сохраняет некоторые циклы ЦП в долгосрочной перспективе.

0 голосов
/ 11 октября 2016

Это один из самых известных шаблонов проектирования, когда речь идет об интервью.

Представьте себе здание с G + 4 этажа. На каждом этаже есть 2 квартиры и в общей сложности 8 квартир в здании. Если в среднем на одну квартиру приходится 4 человека, то на лифте будет минимум 32 участника.

Теперь рассмотрим офисное здание 8 этажей. На каждом этаже есть как минимум 5 офисов, и количество сотрудников в каждом из них никогда не ограничивается.

В первом сценарии нам не понадобилось более одного лифта. Во втором сценарии одного лифта просто не хватило.

Теперь, когда вы поняли необходимость одного подъема против необходимости нескольких подъемов. Это дает нам возможность понять шаблон проектирования Singleton.

SINGLETON DESIGN PATTERN

Как и лифт в предыдущем примере, шаблон проектирования Singleton также используется для создания и использования ТОЛЬКО ОДНОГО экземпляра объекта.

Почему? Поскольку приложению не требуется более одного объекта.

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

Все это потому, что рассматриваемый здесь объект ДОРОГО. С точки зрения программного обеспечения, объект «дорог», когда он использует много ресурсов для выполнения своей операции.

Итак, теперь нам нужен шаблон проектирования Singleton:

1) когда приложение не будет использовать этот объект более нескольких раз на протяжении всего своего жизненного цикла.

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

ОСУЩЕСТВЛЕНИЕ ШАБЛОНА ДИЗАЙНА ОДНОГО ДИЗАЙНА

Шаблон проектирования Singleton утверждает, что: Разрешить создание только одного экземпляра класса во всем приложении и предоставить глобальную точку доступа к нему

Итак, первая часть относится к «ограничивающей» конструкции.

С наших первых дней объектно-ориентированной реализации в Java мы знаем, что конструкторы - это специальные функции, вызываемые во время выполнения программы, и их можно сделать приватными. Когда конструктор становится закрытым, любой код вне класса не может создать свой объект. Поэтому для реализации шаблона проектирования Singleton нам понадобится «закрытый конструктор», и мы создадим объект внутри класса, используя этот конструктор.

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

0 голосов
/ 27 января 2009

В вашем примере нет реальной выгоды иметь только один экземпляр LoadBalancer. Это усложняет понимание возможных преимуществ Singleton.

LoadBalancer в вашем примере просто возвращает случайные серверы.

Представьте себе класс Loadbalancer, который отслеживает, какие серверы он / она уже возвратил, таким образом, LoadBalancer может вернуть сервер с наименьшей нагрузкой.

В этой ситуации необходимо, чтобы все экземпляры Singletonsuz общались с одним и тем же LoadBalancer: если бы они все просто создавали свой собственный (который не знает, что делали другие LoadBalancers), то не было бы реального баланса и отслеживания возвращенные серверы будут бесполезны.

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

Надеюсь, это поможет

Jan

0 голосов
/ 27 января 2009

Ну, вам нужно знать, где патрон, использующий самое главное, не является кодом, специфичным для контекста. Синглтон можно использовать, если вы хотите обеспечить единую точку доступа к методам и свойствам объекта в вашем приложении. Используется, например, в классах, которые обрабатывают доступ к таблице в базе данных. Однако синглтоны имеют тенденцию распространяться через приложения, даже если они вам действительно не нужны

0 голосов
/ 27 января 2009

Синглтоны - это больше, когда вы предоставляете код / ​​библиотеки другим ...

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

Во втором примере не допускается использование нескольких экземпляров ... в первом случае открытый конструктор допускает использование нескольких экземпляров LoadBalancer. Поскольку во втором примере он защищен (закрыт), и вызывающий должен использовать «GetLoadBalancer», который проверяет существующий экземпляр, он принудительно применяет только одну копию.

0 голосов
/ 27 января 2009

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

Использование шаблонов проектирования может ускорить время разработки и может заставить вас думать так, чтобы предотвратить дальнейшие проблемы в будущем. Если вы хотите работать в полевых условиях, крайне важно учиться или, по крайней мере, обладать знаниями о множестве шаблонов проектирования. Компания с большим программным проектом, построенным по определенному шаблону, не будет любезно относиться к вам, если вы начнете писать код, как какой-то ковбой, ломать и портить выбранную идиому. Поскольку это приводит в замешательство других разработчиков в команду и, как правило, усложняет понимание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...