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。一般化して表現するのは奇妙で楽しいですが、他の人にはほとんど認識されない可能性があります。パターンの優れた点は、その 1 つの単語の名前を聞くと、実装が暗示するすべての内部構造について確信を持てるようになることです。

パターンビルダーがあります。あなたのデザインにふさわしい名前でしょうか?

于 2012-08-01T08:30:29.383 に答える
0

パラメータはインターフェイスの一部である必要はなく、実装のコンストラクタに渡すことができることに注意してください。したがって、古いインターフェイスを引き続き使用できます。

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

EngineTypeただし、TrailerCarコンストラクターに渡します。

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 に答える