1、模式說明java
在前一個模板方法(Template Method)模式中,父類定義了處理流程,而流程中用到的方法交給子類去實現。相似的,在工廠方法模式中,父類決定如何生成實例,但並不決定所要生成的具體類,具體的處理交由子類來處理。這樣能夠將生成實例的框架和實例自己解耦。面試
工廠方法模式在不少框架中都有用到,在面試中也問的比較多的,須要重點理解把握。框架
2、工廠方法(Factory Method)模式類圖ide
3、工廠方法(Factory Method)模式中的角色學習
4、工廠方法(Factory Method)代碼示例:this
一、模式框架類的建立,Product類:spa
package com.designpattern.cn.factorymethodpattern.patternframework; public abstract class Product { public abstract void use(); }
二、模式框架類的建立,Factory類:設計
package com.designpattern.cn.factorymethodpattern.patternframework; public abstract class Factory { public final Product create(String owner){ Product product = this.createProduct(owner); this.registerProduct(product); return product; } protected abstract Product createProduct (String owner); protected abstract void registerProduct(Product product); }
三、模式實現類,IDCard身份證類:3d
package com.designpattern.cn.factorymethodpattern.patterndemostrate; import com.designpattern.cn.factorymethodpattern.patternframework.Product; public class IDCard extends Product { private String owner; IDCard(String owner){ System.out.println("製做" + owner + "的ID卡"); this.owner = owner; } public void use(){ System.out.println("使用" + this.owner + "的ID卡"); } public String getOwner() { return owner; } }
四、模式實現類,IDCardFactory類:code
package com.designpattern.cn.factorymethodpattern.patterndemostrate; import com.designpattern.cn.factorymethodpattern.patternframework.Factory; import com.designpattern.cn.factorymethodpattern.patternframework.Product; import java.util.ArrayList; import java.util.List; public class IDCardFactory extends Factory { private List owners = new ArrayList(); protected Product createProduct(String owner){ return new IDCard(owner); } protected void registerProduct(Product product){ owners.add(((IDCard)product).getOwner()); } public List getOwners(){ return owners; } }
五、Main方法類與運行結果:
上面的代碼示例中,工廠模式的createProduct是一個抽象方法,必須在子類中實現該方法,具體能夠選擇三種實現方式:
public Product createProduct(String name){
return new Product(name);
}
若是採用這種方式,Product類就不能定義爲抽象類。
3.拋出異常的方式:
public Product createProduct(String name){
throw new FactoryMethodRuntimeException();
}
這樣一來,就必須在子類中重寫該方法,不然會拋出異常。
5、工廠方法(Factory Method)模式相關的模式