设计模式 - 从不同类型的数据源创建对象

时间:2015-03-04 19:49:38

标签: java design-patterns

对于以下情况,我一直在尝试找到合适的设计模式(如果存在正式设计模式):

对象A需要一个对象B.现在,可以使用来自不同来源的数据创建对象B,例如S_1或S_2。我不希望A必须关心创建B,它应该只是给它并继续。那么,有一个很好的创建B的干净方式吗?我已经考虑过工厂类型的模式,但我没有多态性。我想的是:

B obj_b = B.createInstance(type_S_1);
obj_A.doSomething(obj_B);

其中我将数据类型提供给静态方法createInstance()。

我仍然在学习很多关于设计模式的知识,这就是我要问的原因。我可能会让事情变得复杂,所以请随意说出来!

3 个答案:

答案 0 :(得分:2)

正如您所知,由于您不需要多态性,因此抽象工厂模式对您的用例来说太过分了。尽管如此,这种设计模式的混凝土工厂部分仍然有意义。所以这看起来有点像:

Datasource ds1 = ...;
Datasource ds2 = ...;

MyObject objectA = ...;

DatasourceBasedFactory factory1 = new DatasourceBasedFactory(ds1);
objectA.doSomething(factory1.create());

了解更多关于您实际想做的事情可能有助于为您提供更好的答案。您当前的问题描述非常抽象......如果您可以向我们提供有关您的域名的更多详细信息,那么这将有助于您获得更好的答案。

答案 1 :(得分:1)

我不确定,但也许是Builder Pattern?你可以给它一个类型来指定要构建的内容。

答案 2 :(得分:0)

我会考虑使用泛型的两种不同方法。 客户端将仅处理可能 final 的公共结果对象。 无论您的DataSource是什么,您都可以减少对客户的影响。

方法1

实施例

public interface DataSourceExtractor<T> {
     public DataSourceExtractResult extract(T source);
}

public final ResultSetExtractor implements DataSourceExtractor<ResultSet>{
     public DataSourceExtractResult extract(ResulSet source) {
       //CODE HERE        
       return null;
     }
}

public final ResultSetExtractor implements DataSourceExtractor<JsonNode>{
     public DataSourceExtractResult extract(JsonNode source) {
       //CODE HERE
       return null;
     }
}

但您也可以满足Abstract Class和Interface的优势。 优点是客户端将继承常用方法,或者甚至可以实现模板方法。

实施例

public AbstractDataSourceExtractor<T> implements DataSourceExtractor<T> {

   public static final SomeObject commonMethod(DataSourceExtractResult result) {
      //CODE HERE
      return null;
    }

}

        public final ResultSetExtractor extends AbstractDataSourceExtractor<ResultSet>{
     public DataSourceExtractResult extract(ResulSet source) {
       //CODE HERE
       return null;
     }
}

public final ResultSetExtractor extends AbstractDataSourceExtractor<JsonNode>{
     public DataSourceExtractResult extract(JsonNode source) {
       //CODE HERE
       return null;
     }
}

方法2

实施例

如果需要为实例的构造设置许多元素,您还可以考虑通用的“抽象”构建器。 该解决方案的优点是您可以设置默认值,如有必要,提供隐藏在客户端的内部实现。

public abstract class AbstractDataSourceExtractResultBuilder<T>{

    private T _source;

    public AbstractDataSourceExtractResultBuilder(T source) {
      _source = source;
    }


    public abstract DataSourceExtractResult  build();

}

public final class JsonDataSourceExtractBuilder extends AbstractDataSourceExtractResultBuilder<JsonNode> {

    private String _name;
    private Charset _charset;

   public JsonDataSourceExtractBuilder(JsonNode source, String name){
       //GUARD CODE
       super(source);
       _name = name;
       _charset = Charset.defaultCharset();
   }

   public JsonDataSourceExtractBuilder useCharset(Charset charset){
        if(charset == null){
         throw new IllegalStateException("The charset is null");
        }
        _charset = charset;
        return this;
   }

   //etc...

   public DataSourceExtractResult  build(){
     //CODE HERE
     return null;
   }

}