工廠方法模式
define an interface or abstract class for creating an object but let the subclasses decide which class to instantiate.
參考:
- refactoringguru | factory-method
- javatpoint | factory-method-design-pattern
- 博客園| 工廠方法
簡單工廠的問題
簡單工廠把可能很復雜的對象創建過程分裝在工廠類內部,客戶端只需要給簡單工廠一個“類的標志”,工廠類就能動態返回一個實例化對象,這樣的好處是簡化了客戶端操作,從客戶端按說,符合開閉原則,但每次添加新的產品,都需要修改工廠類,添加新的判斷邏輯,不符合開閉原則。為了解決簡單工廠的這個問題,工廠方法中會先定義一個創建對象的接口或抽象類,然后讓子類去決定實例化哪個類。
工廠方法的優點
- 客戶端只需要知道產品對應的接口即可,無需關心產品的具體實現細節。
- 比簡單工廠有更好的可拓展性,添加新產品只需要實現接口即可。
- 耦合度進一步下降。
適用場景
- 如果無法預知對象確切類別及其依賴關系時
- 需要將類的實例化過程延遲到其子類時
- 工廠方法可以復用創建好的對象來節省資源(緩存)
例
所有工廠類的接口:
public interface IPhoneFactory {BasePhone createPhone();
}
具體的工廠實現類中實例化產品:
public class HonorFactory implements IPhoneFactory {@Overridepublic BasePhone createPhone() {BaseCPU cpu = new KirinFactory().createCPU();BaseCamera camera = new LeicaFactory().createCamera();return new Honor(cpu, camera);}
}
public class OnePlusFactory implements IPhoneFactory {@Overridepublic BasePhone createPhone() {BaseCPU cpu = new QualcommFactory().createCPU();BaseCamera camera = new SonyFactory().createCamera();return new OnePlus(cpu, camera);}
}
客戶端只需要知道相關接口或抽象類即可,無需關心產品細節
public class Consumer {public static void main(String[] args) {BasePhone onePlus = new OnePlusFactory().createPhone();onePlus.printConfig();BasePhone honor = new HonorFactory().createPhone();honor.printConfig();}
}
GitHub | 完整代碼