是否存在基于依赖项创建数据对象的创建模式?

时间:2016-06-01 11:57:26

标签: java design-patterns

我有一个只包含数据的类,但它取决于从中获取数据的连接对象。连接对象管理与更大的API(旧单头C API)的低级套接字连接。目前我有这个:

public class MyData {
    private int data1;

    public MyData(Connection connection) {
         data1 = connection.getLowLevelConnection().someDataFetchCall();
    }

    // getters, setters
}

它有效,但感觉不对。直觉我会说,数据应该在一个函数中获取,该函数返回我初始化的数据对象:

public class DataFetcher {
    public static MyData getMyDataFromConnection(Connection connection) { ... }
    // ... more data fetching functions
}

这种任务是否有命名模式?这样可以更容易地命名这些类。

2 个答案:

答案 0 :(得分:2)

您将数据本身绑定到其加载机制。没有提出任何模式,你应该解耦。我想没有真正可以申请的模式。这是设计原则的问题,尤其是单一责任原则和依赖倒置。单一责任原则说你不应该把属于你的东西分开,你不应该把不属于他们的东西捆绑在一起。依赖倒置原则说不依赖于混凝土,取决于摘要。

设计应该最终提出

  • 一个代表数据的类和
  • 一个类加载数据以满足单一责任 原理

  • 如果要独立于加载机制引入 抽象(例如界面),应用依赖性反转。

存储库"模式"是真的。定义了这样的结构。

附注:我个人不接受标签" pattern"在上面。它只是一个合理结构的标签,如果你应用SOLID原则,无论如何都会达到这个标签。相反,来自GoF的23种设计模式。他们没有弥补,他们被确定了。它们具有内在意义。 "模式"标签表明存储库"模式"属于同一类别,但它并不属于同一类别。它缺乏自然性和原子性。

答案 1 :(得分:1)

  

它有效,但感觉不对。

确实如此。

坚持DDD,如果MyData是一个聚合,或者MyData是一个实体,我会创建一个存储库。无论如何,我将类放到基础结构层并与MyData接口到域层。例如,

MyData实体:

package myapp.domain.model;

public class MyData {
    private int data1;
    // other fields

    public MyData(int data1) {
        this.data1 = data1;
    }

    // other methods
}

服务界面:

package myapp.domain.service;

import myapp.domain.model.MyData;

public interface MyService {
    MyData GetMyData();
}

服务实施:

package myapp.infrastructure.oldapi;

import myapp.domain.model.MyData;
import myapp.domain.service.MyService;

public class MyServiceImpl implements MyService {
    @Override
    public MyData GetMyData() {
        MyData myData = connection.getLowLevelConnection().someDataFetchCall();
        return myData;
    }
}