Форум за съобщения и дискусии по лекционните теми

Теми за онлайн дискусии към модул 3

Re: Теми за онлайн дискусии към модул 3

by Захари Тасков -
Number of replies: 0

Здравейте,

1.Клас Doubleton
При промяна в if блока на константата(2) може да се промени максималния брой на създадените инстанции.
public sealed class Doubleton

    {

        private static Doubleton _doubleton = null;

        private static readonly object doubletonLock = new object();

        private static int counter = 0;

        private Doubleton() { }

 

        public static Doubleton GetInstance()

        {

            lock (doubletonLock)

            {

                if (counter< 2)

                {

                    _doubleton = new Doubleton();

                    counter++;

                }

 

             }

            return _doubleton;
        }

    }

2.Ако Сек-а бъде наследен,то тогава ще бъде нарушено предназначението му,тъй като всеки наследяващ клас ще притежава поне една инстанция.По принцип конструктора на класа Сек е private.Наследяването на класове,които не са предназначени да бъдат наследявани може да доведе до мелета,копиране на информация и кода може да стане сплескан.Ако Сековете имат общо поведение може да бъде изнесено в абстрактен клас.Също така ще е нужно и конструктора да бъде protected.Ако Сек-а бъде наследен ще трябва да бъде създаван статичен метод за всеки клас,които го наследява.Но това ще бъде скриване на метод,а не наследяване.Интересна концепция е наследяването на Сек-калява темето и води до повече издръжливост.

3.Методите на фабриката често се имплементират като виртуални и затова предполагам,че й шаблонът се нарича още "Виртуален конструктор".Тези методи създават обекти на продуктите.Метода фабрика е удобно да се използва,когато продуктите не е нужно да знаят как са създавани.Някой или всички конкретни продукти могат да бъдат създавани по много начини,но също така фабриката позволява лесно добавяне на нов начин за създаване на конкретен продукт.Методът се използва при създаване на библиоктеки.Също така може да бъде използван,когато ни трябва да създадем някои от подкласовете в зависимост от някакви данни,които се предоставят от някъде.Има смисъл методът да е статичен,защото не е нужно на фабриката да създава обект,за да се използва метода. Методът не зависи от никой обект и от никой атрибут на класа.Пример:

 interface Currency {
       String getSymbol();
}
// Concrete Rupee Class code
class Rupee implements Currency {
       @Override
       public String getSymbol() {
              return "Rs";
       }
}

// Concrete SGD class Code
class SGDDollar implements Currency {
       @Override
       public String getSymbol() {
              return "SGD";
       }
}

// Concrete US Dollar code
class USDollar implements Currency {
       @Override
       public String getSymbol() {
              return "USD";
       }
}

 // Factroy Class code
class CurrencyFactory {

       public static Currency createCurrency (String country) {
       if (country. equalsIgnoreCase ("India")){
              return new Rupee();
       }else if(country. equalsIgnoreCase ("Singapore")){
              return new SGDDollar();
       }else if(country. equalsIgnoreCase ("US")){
              return new USDollar();
        }
       throw new IllegalArgumentException("No such currency");
       }
}

4.Бумтяща статия.Предимството на Enum Сек шаблона е ,че е създадената инстанция Instance е thread-safe(гарантира се от JVM , не от разработчика).Също така кода става по-разбираем.Ако не се използва Enum,трябва да се направи заключване на обекта с цел задържане и синхронизиране.Конструктора по подразбиране е private.

5.Примерът в статията е работещ,но не достатъчно изчерпателен.Прекалено е конкретен,но пък показва недостатъците на шаблона доста добре-дублиране на код.Не дава достатъчно добра представа какъв проблем решава шаблона Builder.Написан е в прекалено прост контекст и е много дървен.Шаблонът разделя създаването на сложен обект от представянето му,така че един и същ създаващ процес да може да създава различни представяния.Също така използването на статичен клас от гледна точка на прегледност не е най-красивото нещо,но пък спестявана създаването на нов обект.Специално за композирането на по-сложен обект с шаблона Builder е по-удачно според мен да не се използва статичен клас.Пример към по-абстрактно и толупесто използване на шаблона Builder има в следната статия:
https://www.codeproject.com/Articles/470476/Understanding-and-Implementing-Builder-Pattern-in

6.Чрез използването на Dependency Injection се постига независимост между компонентите.Това прави кода по-четим и също така премахване/добавяне/модифициране на нещо става много по-лесно.Също така чрез използване на различни инструменти при DI може да се постигне производителност и оптимизация като се използва DI container с поведение на Сек.Това довежда по-лесна поддръжка, тестване на приложението,рефакторинг.
Друг вариант,които е описан в статията е използване на метода фабрика.Той може да се използва за създаване на клас и връщане на една и съща инстанция всеки път,когато е извикан.За целта се ползва една фабрика за един Сек.
Друга алтернатива на Сек-а е клас, в които са  използвани  статични методи с цел по-голям вакуум в този клас.

Поздрави с много мощ,
Захари