Проблемы с доступом с использованием Factory Pattern на C # - PullRequest
3 голосов
/ 11 апреля 2019

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

Это мой код для этого случая:

namespace MyNameSpace
{
    class MainApp
    {
        static void Main(string[] args)
        {
            //Problem: I can't access to 
            //the Cube() builder because it's private.
            GeometricFigure cube = new Cube(); 

            Console.WriteLine("Blablabla");
            Console.ReadLine();

        }
    }
}

Это мой метод "Создатель", который реализует шаблон Фабрики

public abstract class GeometricFigure
{
    private float Dimension { get; set; }
    private float Coordinate_X { get; set; }
    private float Coordinate_Y { get; set; }
    private float Coordinate_Z { get; set; }

    public GeometricFigure()
    {
        CreateFigure();
    }

    //Factory method
    public abstract void CreateFigure();
}

А это мой класс "ConcrateCreator"

class Cube : GeometricFigure
{
    public override void CreateFigure() 
    {
        new Cube(); 
    }
}

Я думаю, что мой код хорош .... но ... я не могу понять, почему класс Cube является закрытым. Подводя итог, это правильно установить публичный класс Cube? и если автоответчик не ... Как я могу создать экземпляр объекта куба из метода Main, если класс Cube является закрытым? (

Спасибо всем заранее.

Эмма.

Ответы [ 3 ]

3 голосов
/ 11 апреля 2019

Как уже упоминалось, модификатор доступа по умолчанию для класса в C # - Internal, что делает ваши классы доступными только в той же сборке, которую они объявили.Кроме того, вы смешиваете объект, который хотите создать, с фактической фабрикой.Фабрика - это отдельный экземпляр, который создает объект.Допустим, у вас есть эта абстракция:

public abstract class GeometricFigure
{
    public float Dimension { get; set; }
    public float Coordinate_X { get; set; }
    public float Coordinate_Y { get; set; }
    public float Coordinate_Z { get; set; }
}

и производный класс:

    public class Triangle: GeometricFigure
    {
        public float Dimension { get; set; }
        public float Coordinate_X { get; set; }
        public float Coordinate_Y { get; set; }
        public float Coordinate_Z { get; set; }
    }

Затем вы хотите создать фабрику, которая должна создать экземпляр:

public abstract class GeometricFigureFactory
{
   public abstract GeometricFigure Create();
}

И конкретная реализация этой фабрики:

    public class TriangleFactory: GeometricFigureFactory
    {
        public override GeometricFigure Create()
        {
            return new Triangle();
        }
    }

И использование:

    public class Program
    {
        public static void Main()
        {
            var factory = new TriangleFactory();

            var triangle = factory.Create();
        }
    }

Преимущества этого шаблона - принцип открытого закрытия, который вы не будете нарушать каждый раз, когда вам нужнодобавить новый экземпляр, который наследуется от GeometricFigure.Вы просто создаете новую фабрику, которая расширяет GeometricFigureFactory.Кроме того, вы можете полиморфно использовать как фабрики, так и GeometricFigure сущности

PS. Обновлены ваши частные методы получения и установки для общего доступа, поскольку они уже инкапсулируют частные поля

0 голосов
/ 11 апреля 2019

У вас есть два возможных решения.

  1. Сделать Cube общедоступным.

  2. Создайте его в том же пространстве имен, используя фабричный метод в другом общедоступном классе.

0 голосов
/ 11 апреля 2019

В вашем коде вы вызываете абстрактный класс напрямую. Возможно делает

Cube cube = new Cube();

вместо

GeometricFigure cube = new Cube();

будет иметь значение.

Следующие ссылки также предоставляют много полезной информации о заводской схеме: https://www.c -sharpcorner.com / статьи / завод-метод-дизайн-модель-в-с-диез /

https://www.youtube.com/watch?v=EcFVTgRHJLM

Надеюсь, что все это поможет, а если нет, с удовольствием постараюсь помочь вам в дальнейшем!

...