2010-07-16 100 views
3

當然,下面在Java中(沒有抽象靜態方法)不工作...Java中的抽象靜態工廠方法[getInstance()]?

public abstract class Animal { 
    public abstract static Animal getInstance(byte[] b); 
} 

public class Dog extends Animal { 
    @Override 
    public static Dog getInstance(byte[] b) { 
     // Woof. 
     return new Dog(...); 
    } 
} 

public class Cat extends Animal { 
    @Override 
    public static Cat getInstance(byte[] b) { 
     // Meow. 
     return new Cat(...); 
    } 
} 

什麼要求Animal類有一個靜態getInstance方法實例化本身的正確方法是什麼?這種方法應該是靜態的; 「正常」的抽象方法在這裏沒有意義。

+0

相關:http://stackoverflow.com/questions/129267/why-no-static-methods-in-interfaces-但是,靜態字段和內部類的確定和http://stackoverflow.com/questions/708336/beginner-factory-pattern-in-java – finnw 2010-07-17 00:18:07

回答

6

無法在抽象類(或接口)中指定實現類必須具有特定的靜態方法。

使用反射可以獲得類似的效果。

一種替代方法是定義一個AnimalFactory接口從所述Animal類單獨:

public interface AnimalFactory { 
    Animal getInstance(byte[] b); 
} 

public class DogFactory implements AnimalFactory { 
    public Dog getInstance(byte[] b) { 
     return new Dog(...); 
    } 
} 

public interface Animal { 
    // ... 
} 

class Dog implements Animal { 
    // ... 
} 
+1

它只是沒有任何意義要求一個新的實例從現有的實例中,因爲如果還有零個實例,則無法獲得一個實例。這是經典的靜態工廠方法的出現(很難實現很好的設計我明白,因爲你不能提供靜態接口或抽象方法)。 – gyorgyabraham 2012-09-12 14:03:46