コード例 #1
0
ファイル: Program.cs プロジェクト: Ice2burn/AllDesignPatterns
        static void Main(string[] args)
        {
            // Простое создание клона вручную
            Prototype prototypeA = new ConcretePrototypeA("Prototype A");
            Prototype clone1     = prototypeA.Clone();

            Console.WriteLine(prototypeA.Name);
            Console.WriteLine(clone1.Name);

            // Продвинутое создание клона, так же с клонированием ссылочных типов
            Dependency dependency = new Dependency("Dependency A1");
            CloneablePrototypeAdvanced cloneablePrototype = new CloneablePrototypeAdvanced("Clone", dependency);
            CloneablePrototypeAdvanced clone2             = cloneablePrototype.Clone() as CloneablePrototypeAdvanced;

            // Убедимся, что после клонирования, при изменении dependency, ссылочный тип клона не изменится
            dependency.SetText("Dependency A2");

            Console.WriteLine(cloneablePrototype.GetDependencyText());
            Console.WriteLine(clone2.GetDependencyText());

            // Реализация через фабрику
            ConcretePrototypeN prototypeN = PrototypeFactory.CreatePrototypeN();
            Prototype          clone3     = prototypeN.Clone();

            Console.WriteLine(prototypeN.Name);
            Console.WriteLine(clone3.Name);

            Console.ReadLine();
        }
コード例 #2
0
        // Переопределив данный метод, данный код будет срабатывать при вызове Clone()
        protected override void HandleCloned(CloneableBase baseClone)
        {
            // Выполняем операции из базового класса
            base.HandleCloned(baseClone);

            // Приводим клона к текущему типу
            CloneablePrototypeAdvanced clone = (CloneablePrototypeAdvanced)baseClone;

            // Дополнительная логика. Здесь, например, происходит копирование ссылочной
            // сущности
            clone.Dependency = new Dependency(this.Dependency.Text);
        }