重構之美之一引入工廠方法支持擴展
在開發框架時,若要支持擴展性,引入工廠方法或許會成為神來之筆。例如,在QueryWrapper類的addResource()方法中,需要創建一個IndexWriter對象。
public class QueryWrapper {
public final void addResource(RequestContext context) {
log(”Add new resource.”)
IndexWriter writer = createIndexWriter(context);
//…
}
protected IndexWriter createIndexWriter(RequestContext context){
return new IndexWriterImpl(context);
}
}
public final void addResource(RequestContext context) {
log(”Add new resource.”)
IndexWriter writer = createIndexWriter(context);
//…
}
protected IndexWriter createIndexWriter(RequestContext context){
return new IndexWriterImpl(context);
}
}
根據新的需要,在使用QueryWrapper類時,需要對IndexWriter進行擴展。然而,因為某些原因,我們不能直接修改框架的源代碼。此時,我們可以通過定義QueryWrapper以及IndexWriter類的子類,來達成這一目的:
public class QueryWrapperExtension extends QueryWrapper {
@Override
protected IndexWriter createIndexWriter(RequestContext context){
return new CustomedIndexWriterImpl(context);
}
}
@Override
protected IndexWriter createIndexWriter(RequestContext context){
return new CustomedIndexWriterImpl(context);
}
}
如果在addResource()方法中直接調用構造函數創建IndexWriter對象,則面對擴展的為難之處,可以想見。
全站熱搜