对于以下情况,我一直在尝试找到合适的设计模式(如果存在正式设计模式):
对象A需要一个对象B.现在,可以使用来自不同来源的数据创建对象B,例如S_1或S_2。我不希望A必须关心创建B,它应该只是给它并继续。那么,有一个很好的创建B的干净方式吗?我已经考虑过工厂类型的模式,但我没有多态性。我想的是:
B obj_b = B.createInstance(type_S_1);
obj_A.doSomething(obj_B);
其中我将数据类型提供给静态方法createInstance()。
我仍然在学习很多关于设计模式的知识,这就是我要问的原因。我可能会让事情变得复杂,所以请随意说出来!
答案 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;
}
}