1

我的问题是,如何重新设计抽象工厂。

例如,我得到了车辆的下一个抽象:

interface IEngine { int Power(); }
class Gasoline : IEngine { public int Power() {return 150; }}
class Diesel : IEngine { public int Power() { return 50; }}

interface IFrame { string Name(); }
class Boxed : IFrame { public string Name() { return "Boxed frame"; }}
class Hat : IFrame { public string Name() { return "Hat frame"; }}

interface TransportFactory { 
  IEngine CreateEngine(); 
  IFrame CreateChassis(); 
}
class TrailerCar : TransportFactory { 
  public IEngine CreateEngine() { return new Diesel(); }
  public IFrame CreateChassis() { return new Boxed(); }
}
class PrivateCar : TransportFactory {
    public IEngine CreateEngine() { return new Gasoline(); }
    public IFrame CreateChassis() { return new Hat(); }
}

现在,我可以实例化私人或拖车。

有人建议我改变:拖车发动机可以是涡轮增压或混合动力。仅适用于拖车!对于私家车柴油和汽油发动机仍然是常用的柴油发动机。所以,如果我做改变:

public enum EngineType { Hybrid, Turbo, }

interface TransportFactory
{
    IEngine CreateEngine(EngineType t);
    IFrame CreateChassis();
}

我可以添加类:

class GasolineHybrid : IEngine
{
    public int Power()
    {
        return 70;
    }
}

class GasolineTurbo : IEngine
{
    public int Power()
    {
        return 170;
    }
}

class DieselHybrid : IEngine
{
    public int Power()
    {
        return 60;
    }
}

class DieselTurbo : IEngine
{
    public int Power()
    {
        return 98;
    }
}

很好,但是(!!!)私家车与它无关!我可以使用什么样的设计?旧的抽象不正确?

非常感谢!!!

4

2 回答 2

1

怎么样:

class GasolineHybridTrailerCar : TransportFactory
{
    public IEngine CreateEngine()
    {
        return new GasolineHybrid();
    }
    ...
}

class GasolineTurboTrailerCar : TransportFactory
{
    public IEngine CreateEngine()
    {
        return new GasolineTurbo();
    }
    ...
}

class DieselHybridTrailerCar : TransportFactory
{
    public IEngine CreateEngine()
    {
        return new DieselHybrid();
    }
    ...
}

class DieselTurboTrailerCar : TransportFactory
{
    public IEngine CreateEngine()
    {
        return new DieselTurbo();
    }
    ...
}

产生大量类背后的想法是消除客户做出错误选择的能力。既然你说混合动力和涡轮发动机对私家车没有意义,那就保留 IEngine CreateEngine(EngineType t); 将需要私人汽车厂做出更多努力来拒绝不正确的论点。

我不确定你是不是这个意思,但类名表明汽车是工厂的产品。在经典关系中它将是factory --produce--> product。通过概括来表达它是古怪而有趣的,但其他人几乎无法识别。模式的美妙之处在于,一旦您听到它的一个单词名称,您就会对实现可能暗示的所有内部结构充满信心。

有模式生成器。它会更适合您的设计吗?

于 2012-08-01T08:30:29.383 回答
0

请记住,参数不必是接口的一部分,它们可以传递给实现的构造函数。所以你仍然可以保留你的旧界面:

interface TransportFactory
{
    IEngine CreateEngine();
    IFrame CreateChassis();
}

但将 传递EngineTypeTrailerCar构造函数:

class TrailerCar : TransportFactory { 
  private readonly EngineType engineType;

  public TrailerCar(EngineType engineType)
  {
    this.engineType = engineType;
  }

  public IEngine CreateEngine()
  {
    if (engineType == EngineType.Hybrid) return new DieselHybrid();
    else return new DieselTurbo();
  }

  public IFrame CreateChassis() { return new Boxed(); }
}
于 2012-08-02T02:09:01.750 回答