家具店模拟器开发应选用哪些设计模式?求示例代码与UML类图
设计模式选型结论
该场景组合使用抽象工厂模式+单例模式即可完全覆盖所有需求,选型匹配逻辑如下:
- 抽象工厂模式:解决「同风格成套家具创建、跨风格家具不混配」的核心问题,将不同风格的家具创建逻辑封装隔离,上层代码仅依赖抽象接口,不和具体风格实现耦合
- 单例模式:满足「每个风格仅允许一个实例负责创建对应家具」的约束,避免同风格多工厂实例导致的创建逻辑不一致、资源冗余问题
- 两种模式组合后天然支持后续扩展:新增家具风格时无需修改现有代码,新增家具类型时改动范围可控,完全符合开闭原则
核心UML类图结构对应
整体分为四层,依赖关系从上到下:
- 抽象产品层:定义
Chair(椅子)、Sofa(沙发)、Table(桌子)、Cabinet(柜子)四类家具的公共接口,约定所有同类家具的通用方法- 具体产品层:每个家具风格对应一组家具实现类,比如古典风格对应
ClassicalChair、ClassicalSofa等,现代风格对应ModernChair、ModernSofa等,实现对应接口的风格专属逻辑- 抽象工厂层:定义
FurnitureFactory公共接口,声明四类家具的创建方法- 具体工厂层:每个家具风格对应一个工厂实现类,每个类通过单例逻辑保证全局仅一个实例,重写创建方法返回对应风格的家具对象
示例代码(Java实现)
1. 抽象产品定义
public interface Chair { String getStyle(); void sitOn(); } public interface Sofa { String getStyle(); void lieOn(); } public interface Table { String getStyle(); void putItem(); } public interface Cabinet { String getStyle(); void storeItem(); }
2. 具体产品实现(以古典、现代风格为例)
// 古典风格家具实现 public class ClassicalChair implements Chair { @Override public String getStyle() { return "古典风格"; } @Override public void sitOn() { System.out.println("坐上雕花实木古典椅"); } } public class ClassicalSofa implements Sofa { @Override public String getStyle() { return "古典风格"; } @Override public void lieOn() { System.out.println("躺上硬木扶手古典沙发"); } } public class ClassicalTable implements Table { @Override public String getStyle() { return "古典风格"; } @Override public void putItem() { System.out.println("将物品放到古典八仙桌上"); } } public class ClassicalCabinet implements Cabinet { @Override public String getStyle() { return "古典风格"; } @Override public void storeItem() { System.out.println("将物品存入古典顶箱柜"); } } // 现代风格家具实现 public class ModernChair implements Chair { @Override public String getStyle() { return "现代风格"; } @Override public void sitOn() { System.out.println("坐上极简人体工学现代椅"); } } // ModernSofa、ModernTable、ModernCabinet实现逻辑与上述类似,省略重复代码
3. 抽象工厂+单例具体工厂实现
// 抽象工厂接口 public interface FurnitureFactory { Chair createChair(); Sofa createSofa(); Table createTable(); Cabinet createCabinet(); } // 古典风格工厂(单例) public class ClassicalFurnitureFactory implements FurnitureFactory { private static volatile ClassicalFurnitureFactory instance; // 私有构造方法禁止外部实例化 private ClassicalFurnitureFactory() {} // 双重检查锁实现线程安全的单例获取 public static ClassicalFurnitureFactory getInstance() { if (instance == null) { synchronized (ClassicalFurnitureFactory.class) { if (instance == null) { instance = new ClassicalFurnitureFactory(); } } } return instance; } @Override public Chair createChair() { return new ClassicalChair(); } @Override public Sofa createSofa() { return new ClassicalSofa(); } @Override public Table createTable() { return new ClassicalTable(); } @Override public Cabinet createCabinet() { return new ClassicalCabinet(); } } // 现代风格工厂(单例,实现逻辑与古典工厂一致) public class ModernFurnitureFactory implements FurnitureFactory { private static volatile ModernFurnitureFactory instance; private ModernFurnitureFactory() {} public static ModernFurnitureFactory getInstance() { if (instance == null) { synchronized (ModernFurnitureFactory.class) { if (instance == null) { instance = new ModernFurnitureFactory(); } } } return instance; } @Override public Chair createChair() { return new ModernChair(); } // 其余createSofa、createTable、createCabinet方法返回对应现代风格家具实例,省略重复代码 }
4. 模拟器调用示例
public class FurnitureStoreSimulator { public static void main(String[] args) { // 获取全局唯一的古典风格工厂实例 FurnitureFactory classicalFactory = ClassicalFurnitureFactory.getInstance(); // 生成的所有家具均为古典风格,不会出现混搭问题 Chair chair = classicalFactory.createChair(); Sofa sofa = classicalFactory.createSofa(); chair.sitOn(); sofa.lieOn(); } }
扩展说明
- 新增复古、乡村等新家具风格时,仅需要新增对应风格的一组家具实现类+一个单例工厂类,无需修改任何现有代码,不会影响原有逻辑稳定性
- 新增床、茶几等新家具类型时,仅需要新增对应家具的抽象接口,在抽象工厂中添加对应创建方法,给现有具体工厂补充对应实现即可,扩展成本极低
内容的提问来源于stack exchange,提问作者İlker Galip ATAK
相关产品推荐
相关产品推荐

