Как реализовать фабричный дизайн шаблона c# для рисования фигур? - PullRequest
1 голос
/ 05 апреля 2020

Я пытаюсь выучить c#, а в c# Я пытаюсь реализовать шаблон фабричного дизайна для рисования базовых c фигур, таких как круг, прямоугольник, треугольник и т. Д. c. Я создал класс интерфейса IShape. И другие три класса Circle, Rectangle и Triangle. Я также создал метод ShapeFactory stati c. Эти классы можно вызывать после из класса компилятора и рисовать в другом окне, т.е. в окне вывода. Ниже приведен код.

//IShape Class
namespace CPaint.Class
{
    public interface IShape
    {
        void Draw();
    }
}

//Cicle Class
namespace CPaint.Class
{
    internal class Circle : IShape
    {
        //public Output outputWindow;
        private float x;

        private float y;
        private Color color;
        private float radius;
        private Graphics graphics;

        public Circle(Color color, float x, float y, float radius)
        {
            this.color = color;
            this.x = x;
            this.y = y;
            this.radius = radius;
        }

        public void Draw()
        {
            Pen pen = new Pen(Color.Black, 4);
            SolidBrush brush = new SolidBrush(color);
            graphics.FillEllipse(brush, x, y, radius, radius);
            graphics.DrawEllipse(pen, x, y, radius, radius);
        }
    }
}

//Triangle class
namespace CPaint.Class
{
    internal class Triangle : IShape
    {
        private float x;
        private float y;
        private Color color;
        private float side1;
        private float side2;
        private float side3;

        public Triangle(Color color, float x, float y, float side1, float side2, float side3)
        {
            this.color = color;
            this.x = x;
            this.y = y;
            this.side1 = side1;
            this.side2 = side2;
            this.side3 = side3;
        }

        public void Draw()
        {
            //will write drawing code here...
        }
    }
}

//Shape Factory Class
namespace CPaint.Class
{
    public class ShapeFactory
    {
        public static IShape GetShape(string shapeType, Color color, float x, float y, float height, float width, float radius, float side1, float side2, float side3)
        {
            if (shapeType == null)
            {
                return null;
            }

            if (shapeType.Equals("circle"))
            {
                return new Circle(color, x, y, radius);
            }
            else if (shapeType.Equals("rectangle"))
            {
                return new Rectangle(color, x, y, height, width); ;
            }
            else if (shapeType.Equals("triangle"))
            {
                return new Triangle(color, x, y, side1, side2, side3);
            }
            else
            {
                return null;
            }
        }
    }
}

//Compiler Class
if (code[0].Trim().ToLower().Equals("circle"))
{
    try
    {
        int parameter1 = Int32.Parse(code[1]);

        IShape shape = ShapeFactory.GetShape("circle", color, initX, initY, 0, 0, parameter1, 0, 0, 0);
        outputWindow.Show();

        //outputWindow.outputArea.Image=new ShapeFactory.GetShape("circle", color, initX, initY, 0, 0, parameter1, 0, 0, 0);
        //outputWindow.outputArea.Image = shape;

        output = "command executed successfully: parameter is" + parameter1;
        //output = "is numeric ";
    }

    catch (Exception ex)
    {
        Console.WriteLine("Exception Message: " + ex.Message);
        output = "\n Parameter Error : Invalid/Insufficient Parameter. \n";
    }
}

Здесь, в классе компилятора, я хочу открыть окно вывода с помощью outputWindow.show();, а затем нарисовать фигуру в окне с помощью outputWindow.OutputArea.Image=...

Я застрял. Пожалуйста, помогите.

1 Ответ

1 голос
/ 05 апреля 2020

Этот пост объясняет различия между

  • Factory,
  • Factory Method и
  • Abstract Factory

дизайн моделей.

Поскольку вы хотите иметь возможность создавать целое семейство объектов, которые должны быть "одного и того же типа", это можно сделать с помощью шаблона Abstract Factory .

Фабрика может иметь несколько методов создателя. Вы можете добавить параметры в метод (ы) создателя фабрики.

IShapesFactory.cs - это интерфейс абстрактной фабрики:

public interface IShapesFactory
{
    Circle MakeCircle(Color color, float x, float y, float radius);
    Triangle MakeTriangle(Color color, float x, float y, float side1, float side2, float side3);

}

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

ShapeFactory.cs

public class ShapeFactory: IShapeFactory
{
    private Graphics _graphics;

    public ShapeFactory(Graphics graphics)
    {
        _graphics = graphics;
    }

    public Circle MakeCircle(Color color, float x, float y, float radius)
    {
        // pass the Graphics object in the constructor of Circle
        return new Circle(_graphics, color, x, y, radius); 
    }

    [..other methods of the factory interface]
}

Используемая фабрика:

IShapeFactory factory = new ShapeFactory(graphics);
var circle = factory.MakeCircle(Color.Blue, 10, 10, 20);
circle.Draw();
...