0

这是一个基于OOD的面试问题:

有一个家具类,并有像 WoodChair、WoodTable、SteelChair、SteelTable 这样的派生类。面试官想增加更多的类,比如ironchair,irontable等;我们应该怎么做。该设计尚未发布,我们可以自由修改给出的整个 sutff。

我认为既然我们基本上是在构建家具类型,我们应该在这里使用具有诸如类型(椅子/桌子)和制造(铁/木)等属性的家具类的构建器模式。然后我们将有一个具有功能的接口构建器例如:buildLegs(..)、buildSurface(..) 和子类,如 ChairBuilder、TableBuilder 和 Director 类来实例化所有这些。我们可以在不影响现有设计的情况下添加尽可能多的任何品牌的新家具类型并为它们构建构建器类。

在阅读了Builder Vs Decorator 模式之后,我确信我不应该在这里使用 Decorator 模式。但是Builder也可以吗?是不是矫枉过正?

另外,我不知道如何处理家具的品牌。为 make 添加枚举类型的功能就足够了吗?[钢、铁、木] 制造并没有真正为家具物品添加任何新的行为。

4

2 回答 2

1

看起来需要在现有类中重构一些东西,这也可能有助于避免为将来出现的每一个需求创建一个新类。但这完全取决于上下文:库存应用程序需要完全不同的椅子模型,而不是需要以 3d 显示椅子的软件。你怎么知道的?问面试官,然后你就会知道他们想让你去哪里。

无聊的案例:椅子有一些常见的行为/数据可以在不同的类中重构出来,对于桌子也是如此。现在你如何选择表示材料?同样,这取决于领域,问面试官。这也是您使用的语言的问题:您选择的语言是否支持多重继承?您是否需要(或想要)使用多重继承?支持组合而不是继承可能是有意义的。为什么你会选择一种方式或另一种方式?你甚至需要一个类来表示这条信息吗?

我们应该怎么做。

问面试官,他们会引导你找到解决方案。对于如此宽泛的问题,没有单一的正确答案,他们希望您提出问题并了解您的想法。也就是说,尽管问题很广泛,但它的表述方式可能暗示你应该重构一些东西,以避免必须为每个新的家具和材料组合创建一个类。

可能的解决方案:

  • Table/Chair/Bed 不需要从 Furniture 继承:Furniture 类具有家具的属性和材料的属性。
  • 桌子、椅子、床的类,以及任何具有材料属性的类。材料表示方式的复杂性取决于必须如何对这些信息进行建模:它可以是字符串,也可以是实现 IMaterial 接口的类(木、铁、钢)。
于 2013-02-27T09:47:17.210 回答
0

Probably, i was use Abstract Factory: WoodFurntiture, SteelFurniture, IronFurniture. Each Factory know How to make chair, table. Inside you can use (if you need) other DP, but for a now, i do not see any needs for it

Code:

    namespace Furniture
    {
        class Program
        {
            static void Main(string[] args)
            {
                IFurnitureFactory factory = new WoodFurnitureFactory();
                IFurniture chair = factory.GetChair();
            }
        }

        public interface IFurniture { }
        public class WoodChair : IFurniture { }
        public class WoodTable : IFurniture { }
        public class SteelChair : IFurniture { }
        public class SteelTable : IFurniture { }
        public class IronChair : IFurniture { }
        public class IronTable : IFurniture { }

        public interface IFurnitureFactory
        {
            IFurniture GetChair();
            IFurniture GetTable();
        }

        public class WoodFurnitureFactory : IFurnitureFactory
        {
            public IFurniture GetChair()
            {
                return new WoodChair();
            }

            public IFurniture GetTable()
            {
                return new WoodTable();
            }
        }

        public class IronFurnitureFactory : IFurnitureFactory
        {
            public IFurniture GetChair()
            {
                return new IronChair();
            }

            public IFurniture GetTable()
            {
                return new IronTable();
            }
        }

        public class SteeFurniturelFactory : IFurnitureFactory
        {
            public IFurniture GetChair()
            {
                return new SteelChair();
            }

            public IFurniture GetTable()
            {
                return new SteelTable();
            }
        }
    }
于 2013-02-27T07:21:52.497 回答