设计一个家具类,有WoodChair、WoodTable等类。

问题描述 投票:0回答:2

这是一道基于OOD的面试题。

有一个家具类,并有派生类,如WoodChair,WoodTable,SteelChair,SteelTable,面试官想增加更多的类,如ironchair,irontable等。面试官想增加更多数量的类,如ironchair,irontable等;我们应该怎么做。设计还没有发布,我们可以自由修改整个给定的sutff。

我想,既然我们基本上是在构建家具的类型,我们应该在这里用一个构建器模式,用Furniture类来构建,并带有type(chairirtable)和make(ironwood)等属性。然后我们会有一个接口Builder,其功能包括:buildLegs(...)、buildSurface(...)和子类如ChairBuilder、TableBuilder以及一个Director类来实例化所有这些功能。我们可以在不影响现有设计的情况下,添加任意类型的新家具,并为它们构建一个构建器类。

在阅读完 建筑师VS装饰师模式 我确定这里不应该使用Decorator模式。但是Builder也可以吗?是不是矫枉过正?

另外,我不知道如何处理家具的make。给make添加一个type enum的功能就可以了吗?钢的、铁的、木的】make并没有给家具项目增加任何新的行为。

oop design-patterns decorator builder
2个回答
1
投票

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

无聊的案例:椅子有一些共同的行为数据,可以用不同的类重构出来,Table也是一样。现在,你如何选择表示材料?同样要看领域,问面试官。这也是你使用的语言的问题:你选择的语言是否支持多重继承?你是否 需要 (或 想要)完全使用多重继承?偏重于组成而非继承可能是有道理的。为什么你会选择一种方式或另一种方式?你甚至需要一个类来表示这块信息吗?

我们应该怎么做呢。

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

可能的解决方案。

  • 不需要TableChairBed继承自Furniture:一个Furniture类,其中有一个家具的属性和一个材料的属性。
  • Table、Chair、Bed什么的类,有一个材料的属性。材料如何表示的复杂性取决于这些信息如何被建模:它可以是一个字符串,或者是一个实现IMaterial接口的类(木头、铁、钢)。

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();
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.