C# 使用工厂设计模式实例化两个不相关的子类?
根据我的理解,如果我们有子类实现的相同方法,我们可以使用工厂,类似这样的C# 使用工厂设计模式实例化两个不相关的子类?,c#,C#,根据我的理解,如果我们有子类实现的相同方法,我们可以使用工厂,类似这样的 interface IAnimal { void Eat(); } class Bird : IAnimal { public void Eat() { // bird eats grain } } class Tiger : IAnimal { public void Eat() { // Tiger eats meat } }
interface IAnimal
{
void Eat();
}
class Bird : IAnimal
{
public void Eat()
{
// bird eats grain
}
}
class Tiger : IAnimal
{
public void Eat()
{
// Tiger eats meat
}
}
我们工厂
class AnimalFactory
{
public IAnimal GetInstance(int type)
{
// dependind on type we can return
// animal
}
}
但是如果我们在Bird类中有Fly()和Tiger类中有Walk()这样的子类中有另一个不同的方法呢
class Bird : IAnimal
{
public void Eat()
{
// bird eats grain
}
public void Fly()
{
}
}
class Tiger : IAnimal
{
public void Eat()
{
// Tiger eats meat
}
public void Walk()
{
}
}
实施的最佳方式是什么?我认为,既然子类不能完全实现一个接口,那么我们就不应该使用工厂设计模式?当然,我们仍然可以使用,客户机也可以使用Fly()
和Walk()
方法,将其转换回相应的类
但我的问题是,这仍然是实现工厂设计模式的有效用例吗
我的理解正确吗?如果您使用的是工厂,并且调用代码关心返回的动物是否可以飞行或行走,那么工厂需要返回更派生的类型
interface IAnimal { void Eat(); }
interface IFlyingAnimal : IAnimal { void Fly(); }
interface IWalkingAnimal : IAnimal { void Walk(); }
class Tiger : IWalkingAnimal
{
public void Eat() { }
public void Walk() { }
}
class Bird : IFlyingAnimal
{
public void Eat() { }
public void Fly() { }
}
// The factory lets the caller choose which type of animal it wants:
class AnimalFactory
{
public IFlyingAnimal GetFlyingAnimal() { return new Bird(); }
public IWalkingAnimal GetWalkingAnimal() { return new Tiger(); }
}
// or, you can use separate factories:
class FlyingAnimalFactory
{
public IFlyingAnimal Get() { return new Bird(); }
}
class WalkingAnimalFactory
{
public IWalkingAnimal Get() { return new Tiger(); }
}
这可能是正确的解决方案,也可能不是,这取决于您正在编写的代码。你应该选择适合你需要的款式
您最初的工厂接受一个int-type
参数,这使我认为调用代码可能知道它需要一只老虎或一只鸟。因此,其他解决方案可能是不使用工厂,或者让工厂退回老虎:
public void AnimalFactory
{
public Tiger GetTiger() { return new Tiger(); }
public Bird GetBird() { return new Bird(); }
}
问题是:当您向工厂请求一个
iAnimal
-对象时,您不应该关心它是否可以飞行。所以这个问题是没有意义的。为什么不为这两个类使用Move()
Tiger
将通过行走实现Move()
Bird
将通过飞行实现Move()
。接口背后的全部思想是,您不需要知道类如何实现功能,只需要知道它是如何实现的。