这是一道基于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并没有给家具项目增加任何新的行为。
看起来需要在现有的类中重构一些东西,这可能也有助于避免为将来出现的每一个需求创建一个新的类。但这完全取决于上下文:一个库存应用程序需要一个完全不同的椅子模型,而不是一个需要在3D中显示椅子的软件。你怎么知道呢?问面试官,然后你就会知道他们希望你去哪里。
无聊的案例:椅子有一些共同的行为数据,可以用不同的类重构出来,Table也是一样。现在,你如何选择表示材料?同样要看领域,问面试官。这也是你使用的语言的问题:你选择的语言是否支持多重继承?你是否 需要 (或 想要)完全使用多重继承?偏重于组成而非继承可能是有道理的。为什么你会选择一种方式或另一种方式?你甚至需要一个类来表示这块信息吗?
我们应该怎么做呢。
问问面试官,他们会引导你找到解决方案。这么宽泛的问题,没有唯一正确的答案,他们希望你提出问题,看你怎么想。也就是说,尽管这个问题很宽泛,但它的表述方式可能是一种暗示,你应该重构一些东西,以避免为每一种新的家具和材料组合创建一个类。
可能的解决方案。
也许,我使用的是抽象工厂。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();
}
}
}