设计一个家具类,其中包括木椅,木桌等课程

时间:2013-02-27 07:15:12

标签: oop design-patterns decorator builder

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

有一个Furniture类,派生类如WoodChair,WoodTable,SteelChair,SteelTable。采访者希望增加更多的课程,如铁艺,铁艺等;我们该怎么做该设计尚未公布,我们可以自由修改整个sutff。

我认为既然我们基本上都是建造家具类型,我们应该在这里使用一个带有类别(椅子/桌子)和制作(铁/木头)等属性的家具类。然后我们有一个界面具有以下函数的构建器:buildLegs(..),buildSurface(..)以及类似ChairBuilder,TableBuilder和Director类的子类来实例化所有这些类。我们可以添加任何品牌的新型家具,并为他们构建一个建造者类,而不会影响现有设计。

阅读Builder Vs Decorator pattern后,我确信我不应该在这里使用Decorator模式。但是Builder也行吗?这有点矫枉过正吗?

另外,我不知道如何处理家具的制作。是否可以为make添加枚举类型的功能? [钢,铁,木]制造并没有真正为家具增加任何新的行为。

2 个答案:

答案 0 :(得分:1)

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

无聊案例:主席有一些常见的行为/数据可以在不同的类中重构,对于Table也是如此。现在你如何选择代表材料?再次,它取决于领域,问问面试官。这也是您使用的语言问题:您选择的语言是否支持多重继承?您需要(或想要)是否完全使用多重继承?支持组合而不是继承可能是有意义的。你为什么要这样或那样?你甚至需要一堂课代表这条信息吗?

  

我们应该怎么做。

询问面试官,他们会指导您解决问题。对于如此广泛制定的问题,没有一个正确的答案,他们希望您提出问题,看看您的想法。也就是说,问题的广泛性,它的制定方式可能暗示你应该重构一些东西,以避免为每一个新的家具和材料组合创建一个类。

可能的解决方案:

  • 桌子/椅子/床不需要继承家具:一类具有家具属性和材料属性的家具。
  • 桌子,椅子,床的类别,以及具有该材料属性的任何内容。材料表示方式的复杂程度取决于如何对这些信息进行建模:它可以是字符串,也可以是实现IMaterial界面的Class(Wood,Iron,Steel)。

答案 1 :(得分:0)

可能我使用抽象工厂:WoodFurntiture,SteelFurniture,IronFurniture。 每个工厂都知道如何制作椅子,桌子。 在里面你可以使用(如果你需要)其他DP,但对于现在,我没有看到任何需要它

代码:

    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();
            }
        }
    }