最近我遇到了一个引起我兴趣的建设者模式。
所以,我有一个EntityBuilder
来构建Entity
,但它并没有返回实体。这是方法签名:
public void build();
相反,在build()
方法中,它将创建的新对象Entity
传递给CacheImplementation
实例以存储它。
注意:CacheImpl
是在构建器的构造函数中注入的。
public void build(){
//create new entity
cacheImplementation.add(entity);
}
这听起来像是最佳做法吗?
public interface EntityBuilder {
void setProperty0(PropertyObject propertyObject0);
void setProperty1(PropertyObject propertyObject1);
void setProperty2(PropertyObject propertyObject2);
//...
void build();
}
public class EntityBuilderImpl implements EntityBuilder {
PropertyObject propertyObject0;
PropertyObject propertyObject1;
PropertyObject propertyObject2;
//...
// setters for all properties
@Override
public void build(){
//create new entity
cacheImplementation.add(entity);
}
}
构建器按以下方式使用:
public class EntityProcessor{
private EntityBuilderFactory entityBuilderFactory;//initialized in constructor
void process(EntityDetails entityDetails){
EntityBuilder entityBuilder = this.entityBuilderFactory.getNewEntitytBuilder();
//..
// entityBuilder.set all properties from entityDetails
entityBuilder.build();
}
}
注意:cacheImpl实例只将实体存储在List<>
中,每隔N秒访问一次。
答案 0 :(得分:3)
这听起来像是最佳做法吗?
传统的构建器模式不会将创建的对象存储在任何位置,而只是返回它。
我可以想象一个变体,其中构建器还具有实例控制的作用,以避免创建重复的对象,以及管理不可变对象的存储。
不返回实例的决定可能是明确该方法有副作用。如果该方法返回了该对象,则可能会误导它认为它是一个没有副作用的传统构建器,而在此情况并非如此。
在任何情况下,所有这些只是推测,因为我们还没有看到使用它的其余代码以及它的实现和使用方式。我们没有足够的背景来真正判断。 发明新模式没有任何问题,但可以做得好或坏。
答案 1 :(得分:0)
我在JCodeModel课程中看到过类似的void build()
方法。正如您所看到的,由于IOException:
public void build(File destDir,
PrintStream status)
throws IOException
您基本上要求它为您执行操作,如果没有错误 - 您可以继续工作流程。
答案 2 :(得分:0)