圖解設計模式-factory Method模式
阿新 • • 發佈:2018-08-31
pan 進行 register ray method tor ner style idcard 用Template Method模式構建生成實例的工廠。
在factory method模式中,父類決定實例的生成方式,但是不決定所要生成的具體類,具體的處理交給子類負責。
角色:
Product產品:它定義了在Factory Method模式中的生成的那些實例所持有的接口,由Product類扮演。
Creator創建者:負責生成Product角色的抽象類,由Factory類扮演。
ConcreteProduct具體產品:決定具體的產品,由IDCard類扮演。
ConcreteCreator具體創建者:負責生成具體的產品,有IDCardFactory類扮演此角色。
優點:
提供統一實例工廠的框架。
框架與具體實現分開:可以根據不同產品類、創建不同的產品工廠,例如下面代碼是IDCard產品與IDCardFactory產品工廠,也可以創建其他的產品和產品工廠。
框架:Product產品抽象類、Factory工廠抽象類
具體實現:IDCard產品類、IDCardFactory產品工廠類
代碼:
public abstract class Factory { public final Product create(String owner) { Product product = createProduct(owner); register(product); return product; } public abstract Product createProduct(String owner); public abstract void register(Product product); }
public abstract class Product { public abstract void use(); }
public class IDCard extends Product { private String owner; public IDCard(String owner) { System.out.println("創建"+owner+"的ID卡"); this.owner=owner; } @Override public void use() { System.out.println("使用"+owner+"的ID卡"); } public String getOwner(){ return owner; } }
public class IDCardFactory extends Factory { List owners = new ArrayList<>(); @Override public Product createProduct(String owner) { return new IDCard(owner); } @Override public void register(Product product) { owners.add(((IDCard)product).getOwner()); } }
public class Main { public static void main(String[] args){ Factory factory = new IDCardFactory(); Product product1= factory.create("s1"); Product product2= factory.create("s2"); Product product3= factory.create("s3"); product1.use(); product2.use(); product3.use(); } }執行結果: 創建s1的ID卡 創建s2的ID卡 創建s3的ID卡 使用s1的ID卡 使用s2的ID卡 使用s3的ID卡 代碼說明: Factory抽象類中的create方法定義了創建實例的流程,即調用方法的順序,先調用createProduct創建產品,在調用register方法把創建的產品進行保存(保存在哪裏由具體的工廠決定)。 Product抽象類中use方法定義了被工廠創建的實例中的使用方法,即use方法。(具體實例中方法不用,只起到測試作用,用於確認工廠確實可以創建實例並且調用到對應方法) IDCardFactory類繼承了Factory抽象類,定了createProduct和register方法的具體實現,把創建的實例保存到List集合中。
圖解設計模式-factory Method模式