我是Java编程的新手,我有一个设计问题。目前,我得到的是以下内容:
public class MyFactory {
private MyFactory(){
//hidden constructor
}
public static ImageFilter getInstance(String filterType){
if(filterType == “foo“){
return new FooFilter();
}
return null;
}
}
public abstract class ImageFilter {
public abstract Bitmap filterImage(byte[] data);
//some other stuff
}
public class FooFilter extends ImageFilter {
public C filterImage(byte[] data){
//want to apply filterImageA or filterImageB depending what I put in
//at (*) and (**)
}
private A filterImageA(byte[] data){
//
}
private B filterImageB(byte[] data){
//
}
}
void main(byte[] data) {
ImageFilter bar = MyFactory.getInstance(“foo“);
BitmapType1 myBitmap = bar.filterImage(byte[] data); //(*)
BitmapType2 myBitmap2 = bar.filterImage(byte[] data); //(**)
}
在main方法中,我知道结果类型是什么。如果是BitmapType1,我必须应用filterImageA。如果它是BitmapType2,那么我必须使用filterImageB。是否有通用的方法来做到这一点?我读过有关泛型的内容,但不知道如何在这种特殊情况下使用它们。我希望这不会太混乱。也许整个方法都是垃圾。随意建议一个更好的!
答案 0 :(得分:1)
@Dima的回答是对的。但你也可以使ImageFilter
更具有通用性:
public class MyFactory {
private MyFactory(){
//hidden constructor
}
public static ImageFilter getInstance(String filterType){
if(filterType == “foo“){
return new FooFilter();
}
return null;
}
}
public abstract class ImageFilter {
public abstract <T extends Bitmap> T filterImage(byte[] data, Class<T> clazz);
//some other stuff
}
public class FooFilter extends ImageFilter {
public <T extends Bitmap> T filterImage(byte[] data, Class<T> clazz){
if (BitmapType1.class.isAssignableFrom(clazz)) {
return this.filterImageA(data);
} else if (BitmapType2.class.isAssignableFrom(clazz)) {
return this.filterImageB(data);
}
return null; // or better throw runtime exception
}
private BitmapType1 filterImageA(byte[] data){
//
}
private BitmapType2 filterImageB(byte[] data){
//
}
}
void main(byte[] data) {
ImageFilter bar = MyFactory.getInstance(“foo“);
BitmapType1 myBitmap = bar.filterImage(byte[] data, BitmapType1.class);
BitmapType2 myBitmap2 = bar.filterImage(byte[] data, BitmapType2.class);
}
注意:如果BitmapType1
({1}}继承(直接或不是)BitmapType2
或反之,您需要首先检查层次结构中最具体的类:
if (BitmapType1.class.isAssignableFrom(clazz)) { // BitmapType1 type more concrete
return this.filterImageA(data);
} else if (BitmapType2.class.isAssignableFrom(clazz)) { // BitmapType2 type more general
return this.filterImageB(data);
}
答案 1 :(得分:0)
而不是filterImageA
和filterImageB
,而是创建两个不同的过滤器:一个有filterImage
做filterImageA
做什么,另一个为{{1} }}。
然后在filterImageB
,您知道自己是否想要&#34; A&#34;或者&#34; B&#34;,从工厂中按名称获取正确的过滤器,并在其上调用main
。
答案 2 :(得分:0)
我对这段代码有多处评论:
MyFactory
类可以使用add(String bitmapType, String filterType, ImageFilter filter)
等注册方法,以便保持动态。创建一个bean,将两个值保存为Map
的键(小心equals()
和hashCode()
来保存它们,然后就完成了。实际上,你将拥有{{1}对于每个单一的bitmapType和过滤处理。ImageFilter
作为界面编写,并且 - 如果需要 - 使用模板方法添加ImageFilter
以封装前/后常见行为。