2016-07-05 81 views
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; 
    } 
} 

問題是,人們實際上可以重寫這個類,但是有一個隱藏的陷阱。他們不應該調用默認的構造函數。實際上,整個構造器設計在這裏看起來很糟糕。

任何想法如何改善? 我有這樣的感覺,必須有一個最佳實踐或模式來解決這個問題。

回答

0

不允許無參數構造函數。這是沒有用的。

只是將其刪除:

public class MyFactory <O extends MyObject> extends AbstractFactory<O> 
{  
    protected MyFactory(Class<O> clazz) 
    { 
    super(clazz); 
    } 

    @Override 
    public O createObject() 
    { 
    O objt = super.createObject(); 
    objt.setStuff(stuff); 
    return objt; 
    } 
} 

不過說真的,爲什麼這樣的類都存在嗎?只需爲每個子類創建一個工廠類:

public class MyFactorySub <MyObjectSubclass> extends AbstractFactory<MyObjectSubclass> 
{  
    public MyFactorySub() 
    { 
    super(MyObjectSubclass.class); 
    } 

    @Override 
    public MyObjectSubclass createObject() 
    { 
    MyObjectSubclass objt = super.createObject(); 
    objt.setStuff(stuff); 
    return objt; 
    } 
}