C# 德米特尔定律;工厂模式
我想知道下面的secnerio是否违反了Demeter的法律C# 德米特尔定律;工厂模式,c#,C#,我想知道下面的secnerio是否违反了Demeter的法律 我有两个工厂类CarFactory和BusFactory CarFactory将返回类型为IVehicle的对象 现在我有了另一个包装工厂,比如说VehicleFactory VehicleFactory将返回CarFactory或“BusFactory” 主类将首先调用VehcileFactory以返回CarFactory或BusFactory 然后,CarFactory或BusFactory将返回一辆车(比如Maruthi)或一辆
CarFactory
和BusFactory
CarFactory
将返回类型为IVehicle
的对象VehicleFactory
VehicleFactory
将返回CarFactory
或“BusFactory”VehcileFactory
以返回CarFactory
或BusFactory
CarFactory
或BusFactory
将返回一辆车(比如Maruthi)或一辆公交车类型(比如Volvo)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定律(但它可以以更健壮的方式设计)