java - 进行不同父字段初始化的最佳方法是什么?

标签 java design-patterns design-principles

我有一个类如下

public abstract class MyObjectManager {
   private final Map<MyKey, MyObject> objects;
   private final MySystem system;
   MyObjectManager(MySystem inputSystem) {
     system = inputSystem;
     // also initialize the "objects" field.
   } 
   public void write(MyKey myKey, MyObject myObject) {...}
   public MyObject read(MyKey myKey) {...}
   public abstract MyObject getNewestObject();
}

我需要两种类型的 ConcreteManager,它们将具有不同的 map 实现,例如,

其中一个使用new LinkedHashMap(CAPACITY_1, LOAD_FACTOR_1, true){//覆盖removeEldestEntry(){//逻辑1}}

另一个使用new LinkedHashMap(CAPACITY_2, LOAD_FACTOR_2, false){//覆盖removeEldestEntry(){//逻辑2}}

我不想将 map 作为 @param 传递,因为每个 ConcreteManager 的 map 实现都是固定的。

我应该使用策略模式还是工厂模式来进行不同的 map 初始化?

或者我应该将objects字段移动到每个实现类吗?但他们的读取和写入方法的实现有很多重复。

最佳答案

如果我理解你的问题,在我看来,你可以将 map 添加为抽象类的参数,然后在子构造函数中传递具体的 map 实例。例如:

public abstract class MyObjectManager {

    private final Map<MyKey, MyObject> objects;
    private final MySystem system;

    MyObjectManager(final Map<MyKey, MyObject> objects, MySystem inputSystem) {
        this.objects = objects;
        this.system = inputSystem;
    }
}

public class ConcreteManager extends MyObjectManager {
    public ConcreteManager(MySystem inputSystem) {
        super(new LinkedHashMap(CAPACITY_1, LOAD_FACTOR_1, true), inputSystem);
    }
}

这种方式满足您的限制:

  • Map 类固定为具体的管理器实现
  • 对象属性保留在父类中

关于java - 进行不同父字段初始化的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52617339/

相关文章:

java - 覆盖同步锁中使用的变量是否会阻止其垃圾回收?

HTML5 法国车牌号输入模式

agile - 用于代码构建的最新敏捷设计方法

ruby-on-rails - 设计模式和设计原则有什么区别?

design-patterns - 我是否应该关心传入 XML 设置文件的类表示违反了 demeter 定律?

java - 遍历异构列表

java - 为什么 jersey-bundle 1.17.1 中的 asm 提供了作用域?

java - 线程限制/swingworkers

c++ - 在变量中存储异构类类型

javascript - 通过访问器为函数传递标志——它是哪种 JavaScript 模式?