設計模式之Factory工廠模式
阿新 • • 發佈:2017-09-28
[] png span over create isp 測試 t對象 es2017
在上一章,模板模式中,我們在父類規定處理的流程,在子類中實現具體的處理。如果我們將該模式用於生成實例,便演變成了Factory模式,即工廠模式。
在Factory模式中,父類決定實例的生成方式,但並不決定所要生成的具體的類,具體處理全部交給子類進行。
設計實例則是模仿Spring框架進行的操作,模擬制作身份證。為了模擬Spring框架解耦,我們采用分包的方法,即生成實例的框架放在framework包中,而加工處理,具體實現的類放在具體實現的idcard包中。
- framework包中的product類,用於表示產品這一類東西,定義了一個use抽象方法
package site.wangxin520.gof.factory.framework;/** * 仿spring框架,定義的一個工廠類生產的產品類 * @author wangXgnaw * */ public abstract class Product { /** * 定義一個頂層抽象方法,用於框架中工廠生產的產品,具體實現交給子類 */ public abstract void use(); }
- framework包中的Factory類
package site.wangxin520.gof.factory.framework; /** * 仿spring框架,建立一個Factory工廠,定義三個方法,具體實現交給子類完成。 * 這裏采用的是模板方法 *@author wangXgnaw * */ public abstract class Factory { /** * 使用模板方法,具體創建product的實現交給子類 * @param owner 產品所有者姓名 * @return Product */ protected abstract Product createProduct(String owner); /** * 註冊product * @param product */ protected abstract void registerProduct(Product product);/** * 創建product對象的模板方法 * @param owner 產品所有者姓名 * @return Product */ public final Product create(String owner){ Product p=createProduct(owner); registerProduct(p); return p; } }
- idcard包中的IDCard類
package site.wangxin520.gof.factory.idcard; import site.wangxin520.gof.factory.framework.Product; /** * 身份證的實體類 * @author wangXgnaw * */ public class IDCard extends Product{ /** * 隱藏IDCard的構造函數,拒絕外部包訪問,外部包只能通過工廠模式進行訪問 */ IDCard() { } //IDCard的屬性 private String owner; public String getOwner() { return owner; } public void setOwner(String owner) { this.owner = owner; } @Override public void use() { System.out.println(owner+"使用了身份證"); } }
- idcard包中的IDCardFactory類
package site.wangxin520.gof.factory.idcard; import java.security.acl.Owner; import java.util.ArrayList; import java.util.List; import site.wangxin520.gof.factory.framework.Factory; import site.wangxin520.gof.factory.framework.Product; /** * 創建身份證的工廠 * @author wangXgnaw * */ public class IDCardFactory extends Factory { //記錄登記創建了的產品信息,貌似如果是單例模式的話,就可以直接從這裏取值了,最好是map結構(猜測) private List<Product> createdProduct=new ArrayList<Product>(); @Override protected Product createProduct(String owner) { IDCard idCard=new IDCard(); idCard.setOwner(owner); System.out.println("創建了"+owner+"的身份證"); return idCard; } @Override protected void registerProduct(Product product) { createdProduct.add(product); } }
- 具體測試類
package site.wangxin520.gof.factory.idcard; import site.wangxin520.gof.factory.framework.Factory; import site.wangxin520.gof.factory.framework.Product; /** * 測試工廠類 * @author wangXgnaw * */ public class FactoryTest { public static void main(String[] args) { Factory factory=new IDCardFactory(); Product p1 = factory.create("葵司"); Product p2 = factory.create("上原亞衣"); Product p3 = factory.create("古川伊織"); p1.use(); p2.use(); p3.use(); } }
- 最終控制臺輸出結果為
設計模式之Factory工廠模式