Паттерны, не до конца понимаю итератор и одиночку

Оксана 1234

Пожалуйста, помогите, никак не могу осилить паттерны, немного задачи с горем пополам сделала, а дальше ступор. Спасибо за любую помощь! Использовать шаблон проектирования « Одиночка » ( Singleton ) для описания класса « Дед Мороз» , шаблон проектирования «Абстрактная фабрика» ( Abstract Factory ) для описания создания подарков ( abstract / concrete product ) на фабриках ( abstract / concrete factory ) и шаблон проектирования « Итератор » ( Iterator ) для организации последовательного обращения к списку детей и назначенных им фабрик
using System;
using System.Collections;
 
 
namespace DesignPatterns.Creational
{
    class program
    {
        static void Main()
        {
            ConcreteAggregate a = new ConcreteAggregate();
            a[0] = "Julia";
            a[1] = "Marta";
            a[2] = "Natalka";
            a[3] = "Svitlana";
 
            ConcreteIterator i = new ConcreteIterator(a);
 
 
        }
        // abstract factory
        // абстракна фабрика
        public interface IToyFactory
        {
            Edible GetEdible();
            InEdible GetInEdible();
        }
        
        // concrete factory
        // конкретна фабрика
        public class Goog_factory : IToyFactory
        {
            public Edible GetEdible()
            {
                return new cake();
            }
            public InEdible GetInEdible()
            {
                return new toy();
            }
        }
        // concrete factory
        // конкретна фабрика
        public class Bad_factory : IToyFactory
        {
            public Edible GetEdible()
            {
                return new pill();
            }
            public InEdible GetInEdible()
            {
                return new rod();
            }
        }
 
        public abstract class AnimalToy
        {
            protected AnimalToy(string name)
            {
                Name = name;
            }
            public string Name { get; private set; }
        }
        public abstract class InEdible : AnimalToy
        {
            protected InEdible(string name) : base(name) { }
        }
        public abstract class Edible : AnimalToy
        {
            protected Edible(string name) : base(name) { }
        }
        class cake : Edible
        {
            public cake() : base("cake") { }
        }
        class rod : InEdible
        {
            public rod() : base("rod") { }
        }
        class  pill : Edible
        {
            public pill() : base("pill") { }
        }
        class toy : InEdible
        {
            public toy() : base("toy") { }
        }
 
        public class AbstractFactoryDemo
        {
            public static void Run()
            {
                RunGoodFactory();
                RunBadFactory();
            }
 
            private static void RunBadFactory()
            {
                // lets start with wooden factory
                // спочатку створимо дерев'яну фабрику
                IToyFactory toyFactory = new Bad_factory();
 
                InEdible _rod = toyFactory.GetInEdible();
                Edible _pill = toyFactory.GetEdible();
                Console.WriteLine("I've got {0} and {1}", _rod.Name, _pill.Name);
                // Output/Вивід: [I've got Wooden Bear and Wooden Cat]
            }
 
            private static void RunGoodFactory()
            {
                // and now teddy one
                // а тепер плюшеву
                IToyFactory toyFactory = new Goog_factory();
 
                InEdible _toy = toyFactory.GetInEdible();
                Edible _cake = toyFactory.GetEdible();
                Console.WriteLine("I've got {0} and {1}", _toy.Name, _cake.Name);
                // Output/Вивід: [I've got Teddy Bear and Teddy Cat]
            }
        }
    }
 
    abstract class Aggregate
    {
        public abstract Iterator CreateIterator();
        public abstract int Count { get; protected set; }
        public abstract object this[int index] { get; set; }
    }
 
    /// <summary>
    /// The 'ConcreteAggregate' class
    /// </summary>
    class ConcreteAggregate : Aggregate
    {
        private readonly ArrayList _items = new ArrayList();
 
        public override Iterator CreateIterator()
        {
            return new ConcreteIterator(this);
        }
 
        // Gets item count
        public override int Count
        {
            get { return _items.Count; }
            protected set { }
        }
 
        // Indexer
        public override object this[int index]
        {
            get { return _items[index]; }
            set { _items.Insert(index, value); }
        }
    }
 
    /// <summary>
    /// The 'Iterator' abstract class
    /// </summary>
    abstract class Iterator
    {
        public abstract object First();
        public abstract object Next();
        public abstract bool IsDone();
        public abstract object CurrentItem();
    }
 
    /// <summary>
    /// The 'ConcreteIterator' class
    /// </summary>
    class ConcreteIterator : Iterator
    {
        private readonly Aggregate _aggregate;
        private int _current;
 
        // Constructor
        public ConcreteIterator(Aggregate aggregate)
        {
            this._aggregate = aggregate;
        }
 
        // Gets first iteration item
        public override object First()
        {
            return _aggregate[0];
        }
 
        // Gets next iteration item
        public override object Next()
        {
            object ret = null;
            if (_current < _aggregate.Count - 1)
            {
                ret = _aggregate[++_current];
            }
 
            return ret;
        }
 
        // Gets current iteration item
        public override object CurrentItem()
        {
            return _aggregate[_current];
        }
 
        // Gets whether iterations are complete
        public override bool IsDone()
        {
            return _current >= _aggregate.Count;
        }
    }
}
А это задание : В этом году « Деду Морозу » помогает « Фабрика добрых подарков »и« Фабрика плохих подарков » , каждая из которых создает один съедобный и один несъедобный подарок (методы абстрактной фабрики и абстрактные продукты соответственно) . Для того , чтобы получить подарок , дети присылают сообщение в виде двух цифр : количества хороших и плохих поступков , которые они совершили за последний год. «Дед Мороз» собирает сообщения от детей и решает , отправить ребенку хороший или плохой подарок в зависимости от того, каких поступков больше ( хороших или плохих ) - назначает каждому ребенку в списке соответствующую конкретную фабрику.
6 ответов

Оксана 1234

Мне кажется, что "учить паттерны" это как учить таблицу интегралов. Довольно бесполезное занятие. Они сами выучатся, когда придется с ними иметь дело постоянно. Поэтому если вас не заставляет кто-то это делать - просто забейте. Когда будет задача, которая проще всего решается через паттерны - вы это почувствуете. А паттерн итератора реализован на уровне языка - оператор foreach. Можете навелосипедить собственный итератор и посмотреть, Как он работает. А причем тут синглтон я так и не понял. Название темы никак не коррелирует с содержаниемю


Оксана 1234

Psilon, зубрить их не надо.. Их понимать надо По сути, они часто применяются и в жизни, просто мы этого не замечаем.. В общем-то, в этом и удобство ООП для многих программистов - что можно абстрагироваться на окружающий мир. К примеру, образно, одиночка - планета "Земля", спутник "Луна" - только по одному.. И создать еще одну планету и спутник того же типа у нас (по-крайней мере, пока) не получится - можно сказать, что наши текущие знания выступают в роли того самого "getInstance", не давая нам создать еще таких объектов Или фабрика - тут еще проще.. Обычный завод по выпуску какой-то техники, например, автомобилей.. Особенно российские - вон, штампуют однообразные машины (ваз-ы), ну прям как заточены под этот шаблон...


Оксана 1234

Я понимаю все претензии, но задание является заданием и пока я не могу его осилить. Даже то что я написала далось мне за много часов работы.


Оксана 1234

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


Оксана 1234

Оксана 1234, вот простейший пример класса с итератором:
    public class Fibonacci : IEnumerable<long>
    {
        public int N { get; set; }
 
        public Fibonacci(int n)
        {
            N = n;
        }
 
 
        public IEnumerator<long> GetEnumerator()
        {
            if (N <= 0)
                yield break;
            long fibN2 = 0, fibN1 = 1;
            for (int i = 0; fibN1 < N; i++)
            {
                yield return fibN1;
                var temp = fibN1;
                fibN1 += fibN2;
                fibN2 = temp;
            }
        }
 
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }


Оксана 1234

Вот так должно быть, а как отсюда обратиться к назначеным им фабрикам с помочью итератора.
static void Main()
        {
            ConcreteAggregate a = new ConcreteAggregate();
            a[0] = "Julia";
            a[1] = "Marta";
            ConcreteIterator i = new ConcreteIterator(a);
 
            int[] b = { 20, 23 };//masuv horoshuh vchunkiv
 
            int[] c = { 12, 25 };//masuv pohanuh vchunkiv
            object item = i.First();
            if (c[1] > b[1])
            {
                Console.WriteLine(item);
                item = i.Next();
            }