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

仅单个类变量存在差异的两个类适用何种设计模式?

针对你的类重复问题,这两个设计方案更合适!

嘿,这个场景太典型啦!你看A和B两个类除了str的初始值不一样,其他逻辑完全一致,用继承当然可以,但其实有更简洁的方式来避免代码重复,下面给你推荐两种最贴合的方案:

方案1:继承+父类封装通用逻辑(贴合你原本的思路)

你可以先定义一个父类,把通用的method()方法放在父类里,把差异化的str作为可配置属性,子类只需要通过构造方法传入不同的str值就行,完美消除重复代码:

// 父类封装所有通用逻辑
abstract class BaseClass {
    protected String str;

    // 通过构造方法传入差异化的字符串
    protected BaseClass(String str) {
        this.str = str;
    }

    // 通用的方法只写一次
    void method() {
        System.out.print(str);
    }
}

// 子类只负责传入自己的专属字符串,不用重复写method
class A extends BaseClass {
    public A() {
        super("A");
    }
}

class B extends BaseClass {
    public B() {
        super("B");
    }
}

以后如果要修改method()的逻辑(比如改成打印字符串加换行),只需要改父类就行,不用同时改A和B,维护起来超方便。

方案2:策略模式(更轻量,适合不需要子类的场景)

如果你的场景里不需要专门创建A、B这类子类,只是需要不同的打印行为,策略模式会更灵活。把差异化的打印逻辑抽成策略接口,核心执行类依赖这个接口,使用时直接传入不同的策略即可:

// 定义打印策略接口
interface PrintStrategy {
    void print();
}

// 通用的执行类,只负责调用策略
class Printer {
    private PrintStrategy strategy;

    public Printer(PrintStrategy strategy) {
        this.strategy = strategy;
    }

    void execute() {
        strategy.print();
    }
}

// 使用的时候直接传入不同的策略,甚至用lambda简化
public class Main {
    public static void main(String[] args) {
        Printer printerA = new Printer(() -> System.out.print("A"));
        Printer printerB = new Printer(() -> System.out.print("B"));
        
        printerA.execute(); // 输出A
        printerB.execute(); // 输出B
    }
}

这种方式不用创建一堆子类,以后要加新的打印内容,直接传个新的lambda就行,非常轻量灵活。

小总结

原来的写法重复了method()的逻辑,违反了DRY(Don't Repeat Yourself)原则,上面两种方案都能解决这个问题:如果你偏爱继承的思路,选方案1;如果想要更灵活的配置,选方案2就好~

内容的提问来源于stack exchange,提问作者minotna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:47:14