4

我在面试中遇到了以下问题,我在谷歌上找不到任何解决方案或堆栈溢出。我不知道这真的是一个有效的问题(因为我没有得到任何背景。他在说什么背景)??

我被要求说出抽象工厂模式的众所周知的问题以及哪些模式解决了这个问题。

那么任何人都可以帮助我弄清楚那个问题到底是什么(秘密)

抽象工厂设计模式的缺点是什么?

我浏览过这个链接,但不知道还有哪些其他模式解决了抽象工厂的缺点。

4

3 回答 3

2

引用 GoF 的“设计模式”(一种程序员圣经):“支持新类型的产品是困难的。扩展抽象工厂以生产新类型的产品并不容易。那是因为 AbstractFactory 接口修复了可以支持新类型的产品需要扩展工厂接口,这涉及更改 AbstractFactory 类及其所有子类。

于 2016-09-05T07:41:43.503 回答
1

正如@o_weisman 所说;AF 的主要缺点是可扩展性,但如果有一种技术可以解决该问题,以设计模式(针对常见问题的通用可重用解决方案),默认情况下它将成为 AF 的一部分。所以我认为这个没有上下文的问题不是一个有效的问题。

避免界面更改并因此破坏客户端的一种技术是仅使用一种 Create 方法来创建所有元素。但我怀疑这是一个有官方名称的模式。

即在 C# 上:

namespace ConsoleApplication1
{
  public enum Appearance
  {
    Win,
    OSX
  }
  interface IButton
  {
    void Paint();
  }

  interface ITextBox
  {
    void Paint();
  }

  interface IGUIFactory
  {
    TElement CreateGUIElement<TElement>() where TElement : class;
  }

   class GUIFactory
  {
    public static  IGUIFactory Create(Appearance lookAndFeel) {

      if (lookAndFeel == Appearance.Win) { return new WinFactory(); }
      if (lookAndFeel == Appearance.OSX) { return new OSXFactory(); }
      throw new NotImplementedException();
    }
  }

  abstract class AGUIFactory : IGUIFactory
  {
    public TElement CreateGUIElement<TElement>() where TElement : class
    {
      if (typeof(IButton) == typeof(TElement)) { return CreateButton() as TElement; }
      if (typeof(ITextBox) == typeof(TElement)) { return CreateTextBox() as TElement; }
      throw new NotImplementedException();
    }

    protected abstract IButton CreateButton();
    protected abstract ITextBox CreateTextBox();
  }


  class WinFactory : AGUIFactory
  {
    protected override IButton CreateButton()
    {
      return new WinButton();
    }

    protected override ITextBox CreateTextBox()
    {
      return new WinTextBox();
    }
  }

  class OSXFactory : AGUIFactory
  {
    protected override IButton CreateButton()
    {
      return new OSXButton();
    }

    protected override ITextBox CreateTextBox()
    {
      return new OSXTextBox();
    }
  }

  class WinButton : IButton
  {
    public void Paint()
    {
      Console.WriteLine("Windown button paint");
    }
  }

  class OSXButton : IButton
  {
    public void Paint()
    {
      Console.WriteLine("OSX button paint");
    }
  }

  class WinTextBox : ITextBox
  {
    public void Paint()
    {
      Console.WriteLine("Windown TextBox paint");
    }
  }

  class OSXTextBox : ITextBox
  {
    public void Paint()
    {
      Console.WriteLine("OSX TextBox paint");
    }
  }


  class Program
  {
    static void Main()
    {
      IGUIFactory factory;
      IButton btn;
      ITextBox txb;

      factory = GUIFactory.Create(Appearance.Win); //UserSettings.LookAndFeel
      btn = factory.CreateGUIElement<IButton>();
      txb = factory.CreateGUIElement<ITextBox>();
      btn.Paint();
      txb.Paint();

      factory = GUIFactory.Create(Appearance.OSX);
      btn = factory.CreateGUIElement<IButton>();
      txb = factory.CreateGUIElement<ITextBox>();
      btn.Paint();
      txb.Paint();

      Console.ReadLine();
    }
  }

}
于 2016-09-06T05:53:19.817 回答
1

看看关于抽象工厂的sourcemaking文章。

有时,创造模式是竞争对手:在某些情况下,Prototype或者Abstract Factory可以有利可图地使用。在其他时候,它们是互补的。

通常,设计开始使用Factory Method(不太复杂,更可定制,子类激增)并随着设计人员发现需要更多灵活性的地方而向 , 或(更灵活,更复杂)Abstract Factory发展PrototypeBuilder

对于构造复杂的对象,Builder是正确的选择,它提供了更多的灵活性。可能是你的面试官正在寻找这种答案。

于 2016-09-05T17:30:32.967 回答