You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

家具店模拟器开发应选用哪些设计模式?求示例代码与UML类图

设计模式选型结论

该场景组合使用抽象工厂模式+单例模式即可完全覆盖所有需求,选型匹配逻辑如下:

  • 抽象工厂模式:解决「同风格成套家具创建、跨风格家具不混配」的核心问题,将不同风格的家具创建逻辑封装隔离,上层代码仅依赖抽象接口,不和具体风格实现耦合
  • 单例模式:满足「每个风格仅允许一个实例负责创建对应家具」的约束,避免同风格多工厂实例导致的创建逻辑不一致、资源冗余问题
  • 两种模式组合后天然支持后续扩展:新增家具风格时无需修改现有代码,新增家具类型时改动范围可控,完全符合开闭原则
核心UML类图结构对应

整体分为四层,依赖关系从上到下:

  1. 抽象产品层:定义Chair(椅子)、Sofa(沙发)、Table(桌子)、Cabinet(柜子)四类家具的公共接口,约定所有同类家具的通用方法
  2. 具体产品层:每个家具风格对应一组家具实现类,比如古典风格对应ClassicalChair、ClassicalSofa等,现代风格对应ModernChair、ModernSofa等,实现对应接口的风格专属逻辑
  3. 抽象工厂层:定义FurnitureFactory公共接口,声明四类家具的创建方法
  4. 具体工厂层:每个家具风格对应一个工厂实现类,每个类通过单例逻辑保证全局仅一个实例,重写创建方法返回对应风格的家具对象
示例代码(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 06:03:18