Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
!Шпора по ООПиП (3).docx
Скачиваний:
35
Добавлен:
22.09.2019
Размер:
2.31 Mб
Скачать

72. Строитель (шаблон проектирования)

Строитель (англ. Builder) — порождающий шаблон проектирования.

Цель

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

Плюсы

  • позволяет изменять внутреннее представление продукта;

  • изолирует код, реализующий конструирование и представление;

  • дает более тонкий контроль над процессом конструирования.

Применение

  • алгоритм создания сложного объекта не должен зависеть от того, из каких частей состоит объект и как они стыкуются между собой;

  • процесс конструирования должен обеспечивать различные представления конструируемого объекта.

using System;

using System.Collections.Generic;

namespace Builder

{

public class MainApp

{

public static void Main()

{

// Create director and builders

Director director = new Director();

Builder b1 = new ConcreteBuilder1();

Builder b2 = new ConcreteBuilder2();

// Construct two products

director.Construct(b1);

Product p1 = b1.GetResult();

p1.Show();

director.Construct(b2);

Product p2 = b2.GetResult();

p2.Show();

// Wait for user

Console.Read();

}

}

// "Director"

class Director

{

// Builder uses a complex series of steps

public void Construct(Builder builder)

{

builder.BuildPartA();

builder.BuildPartB();

}

}

// "Builder"

abstract class Builder

{

public abstract void BuildPartA();

public abstract void BuildPartB();

public abstract Product GetResult();

}

// "ConcreteBuilder1"

class ConcreteBuilder1 : Builder

{

private readonly Product product = new Product();

public override void BuildPartA()

{

product.Add("PartA");

}

public override void BuildPartB()

{

product.Add("PartB");

}

public override Product GetResult()

{

return product;

}

}

// "ConcreteBuilder2"

class ConcreteBuilder2 : Builder

{

private readonly Product product = new Product();

public override void BuildPartA()

{

product.Add("PartX");

}

public override void BuildPartB()

{

product.Add("PartY");

}

public override Product GetResult()

{

return product;

}

}

// "Product"

class Product

{

private readonly List<string> parts = new List<string>();

public void Add(string part)

{

parts.Add(part);

}

public void Show()

{

Console.WriteLine("\nProduct Parts -------");

foreach (string part in parts)

Console.WriteLine(part);

}

}

}

73. Фабричный метод (шаблон проектирования)

Порождающий шаблон проектирования, предоставляющий подклассам интерфейс для создания экземпляров некоторого класса. В момент создания наследники могут определить, какой класс инстанциировать. Иными словами, Фабрика делегирует создание объектов наследникам родительского класса. Это позволяет использовать в коде программы не специфические классы, а манипулировать абстрактными объектами на более высоком уровне. Также известен под названием виртуальный конструктор.

Цель

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

  • классу заранее неизвестно, объекты каких подклассов ему нужно создавать.

  • класс спроектирован так, чтобы объекты, которые он создаёт, специфицировались подклассами.

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

Структура

  • Product — продукт

    • определяет интерфейс объектов, создаваемых абстрактным методом;

  • ConcreteProduct — конкретный продукт

    • реализует интерфейс Product;

  • Creator — создатель

    • объявляет фабричный метод, который возвращает объект типа Product. Может также содержать реализацию этого метода «по умолчанию»;

    • может вызывать фабричный метод для создания объекта типа Product;

  • ConcreteCreator — конкретный создатель

    • переопределяет фабричный метод таким образом, чтобы он создавал и возвращал объект класса ConcreteProduct.

Плюсы

  • позволяет сделать код создания объектов более универсальным, не привязываясь к конкретным классам (ConcreteProduct), а оперируя лишь общим интерфейсом (Product);

  • позволяет установить связь между параллельными иерархиями классов.

Минусы

  • необходимость создавать наследника Creator для каждого нового типа продукта (ConcreteProduct).

// "ConcreteProductA"

class ConcreteProductA : Product

{

}

// "ConcreteProductB"

class ConcreteProductB : Product

{

}

// "Creator"

abstract class Creator

{

public abstract Product FactoryMethod();

}

// "ConcreteCreatorA"

class ConcreteCreatorA : Creator

{

public override Product FactoryMethod()

{

return new ConcreteProductA();

}

}

// "ConcreteCreatorB"

class ConcreteCreatorB : Creator

{

public override Product FactoryMethod()

{

return new ConcreteProductB();

}

}