1
有一個類MyFactory
它創建一個MyObject
。 實例化使用反射完成,接下來的調用者被調用。 按照我們的慣例,MyObject
類需要有一個公共的默認構造函數(即沒有參數)。一個可擴展的工廠類與仿製藥和反射
我們MyFactory看起來是這樣的:
public class MyFactory extends AbstractFactory<MyObject>
{
public MyFactory()
{
super(MyObject.class);
}
@Override
public MyObject createObject()
{
MyObject objt = super.createObject();
objt.setStuff(stuff);
return objt;
}
}
它使用一個簡單的抽象工廠:
public abstract class AbstractFactory <T>
{
private Class<? extends T> clazz;
public AbstractFactory(Class<? extends T> clazz)
{
this.clazz = clazz;
}
public T createObject()
{
return clazz.newInstance();
}
}
的問題開始,當人們想取代工廠創建被延伸的MyObject
對象(例如MyExtendedObject
)。 我們添加了一個構造函數來促進這一點。
protected MyFactory(Class<? extends MyObject> clazz)
{
super(clazz);
}
而在一審這足以創建擴展工廠,如:
public class MyExtendedFactory extends MyFactory
{
public MyExtendedFactory()
{
super(MyExtendedObject.class);
}
@Override
public MyObject createObject()
{
// and this is a bit uggly
MyExtendedObject objt = (MyExtendedObject) super.createObject();
objt.setExtendedStuffToo(extendedStuff);
return objt;
}
}
所以,一切正常,但是很明顯,人們想用仿製藥代替。所以,我們試圖提供仿製藥。然後事情變得複雜起來。
public class MyFactory <O extends MyObject> extends AbstractFactory<O>
{
public MyFactory()
{
// but now this is uggly and not really correct.
super(Class<O> extends MyObject.class);
}
protected MyFactory(Class<O> clazz)
{
super(clazz);
}
@Override
public O createObject()
{
O objt = super.createObject();
objt.setStuff(stuff);
return objt;
}
}
問題是,人們實際上可以重寫這個類,但是有一個隱藏的陷阱。他們不應該調用默認的構造函數。實際上,整個構造器設計在這裏看起來很糟糕。
任何想法如何改善? 我有這樣的感覺,必須有一個最佳實踐或模式來解決這個問題。