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()
。接口背后的全部思想是,您不需要知道类如何实现功能,只需要知道它是如何实现的。