gpt4 book ai didi

c# - C#上使用工厂模式访问问题

转载 作者:行者123 更新时间:2023-11-30 16:38:13 25 4
gpt4 key购买 nike

我是模式的新手,我开始研究工厂模式来做一个关于几何图形的练习。

这是我在这种情况下的代码:

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();

}
}
}

这是我实现工厂模式的“Creator”方法

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 类是私有(private)的。综上所述,公开Cube类是否正确?如果答案不是... 如果 Cube 类是私有(private)的,我如何从 Main 方法实例化 cube 对象? :(

在此先感谢大家。

艾玛。

最佳答案

正如人们提到的,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 实体

附言将您的私有(private) getter 和 setter 更新为公开,因为它们已经封装了私有(private)字段

关于c# - C#上使用工厂模式访问问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55631706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com