Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 德米特尔定律;工厂模式_C# - Fatal编程技术网

C# 德米特尔定律;工厂模式

C# 德米特尔定律;工厂模式,c#,C#,我想知道下面的secnerio是否违反了Demeter的法律 我有两个工厂类CarFactory和BusFactory CarFactory将返回类型为IVehicle的对象 现在我有了另一个包装工厂,比如说VehicleFactory VehicleFactory将返回CarFactory或“BusFactory” 主类将首先调用VehcileFactory以返回CarFactory或BusFactory 然后,CarFactory或BusFactory将返回一辆车(比如Maruthi)或一辆

我想知道下面的secnerio是否违反了Demeter的法律

  • 我有两个工厂类
    CarFactory
    BusFactory
  • CarFactory
    将返回类型为
    IVehicle
    的对象
  • 现在我有了另一个包装工厂,比如说
    VehicleFactory
  • VehicleFactory
    将返回
    CarFactory
    或“BusFactory”
  • 主类将首先调用
    VehcileFactory
    以返回
    CarFactory
    BusFactory
  • 然后,
    CarFactory
    BusFactory
    将返回一辆车(比如Maruthi)或一辆公交车类型(比如Volvo)
  • 然后调用总线类型的Car方法
  • 下面是示例代码

    类别:
    Maruthi

    public class Maruthi:IVehicle
    {
        public void MakeVehicle()
        {
            Console.WriteLine("Maruthi..");
        }
    }
    
    public class CarFactory:IVehicleFactory
    {
        IVehicle car;
        public IVehicle GetVehicle(string type)
        {
            switch (type)
            {
                case "Maruthi":
                    car= new Maruthi();
                    break;
            }
            return car;
        }
    }
    
    public class VehicleFactory
    {
    
        public static IVehicleFactory GetVehicleFactory (string Factorytype)
        {
            IVehicleFactory VehFact=null;
            switch (Factorytype)
            {
                case "Car":
                    VehFact = new CarFactory();
                    break;
            }
            return VehFact;
        }
    }
    
    类别:
    CarFactory

    public class Maruthi:IVehicle
    {
        public void MakeVehicle()
        {
            Console.WriteLine("Maruthi..");
        }
    }
    
    public class CarFactory:IVehicleFactory
    {
        IVehicle car;
        public IVehicle GetVehicle(string type)
        {
            switch (type)
            {
                case "Maruthi":
                    car= new Maruthi();
                    break;
            }
            return car;
        }
    }
    
    public class VehicleFactory
    {
    
        public static IVehicleFactory GetVehicleFactory (string Factorytype)
        {
            IVehicleFactory VehFact=null;
            switch (Factorytype)
            {
                case "Car":
                    VehFact = new CarFactory();
                    break;
            }
            return VehFact;
        }
    }
    
    类别:
    车辆工厂

    public class Maruthi:IVehicle
    {
        public void MakeVehicle()
        {
            Console.WriteLine("Maruthi..");
        }
    }
    
    public class CarFactory:IVehicleFactory
    {
        IVehicle car;
        public IVehicle GetVehicle(string type)
        {
            switch (type)
            {
                case "Maruthi":
                    car= new Maruthi();
                    break;
            }
            return car;
        }
    }
    
    public class VehicleFactory
    {
    
        public static IVehicleFactory GetVehicleFactory (string Factorytype)
        {
            IVehicleFactory VehFact=null;
            switch (Factorytype)
            {
                case "Car":
                    VehFact = new CarFactory();
                    break;
            }
            return VehFact;
        }
    }
    
    Main

    static void Main(string[] args)
        {
            IVehicleFactory vehFact = VehicleFactory.GetVehicleFactory("Car");
            IVehicle veh = vehFact.GetVehicle("Maruthi");
            veh.MakeVehicle();
            Console.ReadLine();
        }
    
    i车辆

    namespace LOD_ViolationorNot
    {
       public interface IVehicle
        {
           void MakeVehicle();
        }
    }
    

    我没有看到
    ICar
    IBus
    。如果您有工作代码,请考虑。嗨,我已经添加了接口。接口是IVehicle。那么Maruthi就是实现IVehicle的汽车。还没有实现总线,因为它的实现也将与MaruthiIt的实现相同。看起来客户端和实际创建的实体之间的两层是不必要的。是的,那么,我会说这里的设计违反了德米特定律。@WiktorZychla德米特定律表示函数可以访问它自己创建的对象。我认为使用new关键字创建对象与使用我们知道它只创建对象的方法(因为它是创建模式的实现)之间没有区别。它们在更高的抽象层次上是相同的。因此,我认为主要方法中的代码没有违反德米特定律(但它可以以更稳健的方式设计),我看不到
    ICar
    IBus
    。如果您有工作代码,请考虑。嗨,我已经添加了接口。接口是IVehicle。那么Maruthi就是实现IVehicle的汽车。还没有实现总线,因为它的实现也将与MaruthiIt的实现相同。看起来客户端和实际创建的实体之间的两层是不必要的。是的,那么,我会说这里的设计违反了德米特定律。@WiktorZychla德米特定律表示函数可以访问它自己创建的对象。我认为使用new关键字创建对象与使用我们知道它只创建对象的方法(因为它是创建模式的实现)之间没有区别。它们在更高的抽象层次上是相同的。因此,我认为主方法中的代码没有违反Demeter定律(但它可以以更健壮的方式设计)