2018-1-20 by Atlasspring
核心工廠類再也不負責全部產品的建立,而是將具體建立的工做交給子類去作,成爲一個抽象工廠角色,僅負責給出具體工廠類必須實現的接口,而不接觸哪個產品類應當被實例化這種細節。架構
Template Method Pattern是在父類創建處理邏輯的大綱骨架,而在子類補充具體的處理內容。把Template Method Pattern應用在生成對象實例方面,以Template Method Pattern架構獲取產生對象實例的工廠,就是Factory Method Pattern。框架
- Product(產品)參與者
框架的部分。這個抽象類規定此Pattern所產生的對象實例應有的接口,具體內容則由子類的ConcreteProduct參與者規定。- Creator(生產者)參與者
框架的部分。這是產生Product參與者的抽象類。具體的內容由子類的ConcreteCreator參與者決定。
Creator參與者對於實際產生的ConcreteProduct參與者徹底一無所知。Creator參與者惟一直到的是隻要調用Product參與者和產生對象的方法,就能產生Product。- ConcreteProduct(具體產品)參與者
實際處理內容的部分。規定具體的產品樣式。- ConcreteCreator(具體生產者)參與者
實際處理內容的部分。規定製造實際產品的類。
public abstract class Product { public abstract void use(); } public abstract class Factory { public final Product create(String owner) { Product p = createProduct(owner); registerProduct(p); return p; } protected abstract Product createProduct(String owner); protected abstract void registerProduct(Product product); } public class IDCard extends Product { private String owner; public IDCard(String owner){ System.out.println("建立" + owner + "的卡。"); this.owner = owner; } public void use() { System.out.println("使用" + owner + "的卡。"); } public String getOwner() { return owner; } } public class IDCardFactory extends Factory { private Vector<String> owners = new Vector<String>(); protected Product createProduct(String owner) { return new IDCard(owner); } protected void registerProduct(Product product) { IDCard card = (IDCard) product; owners.add(card.getOwner()); } public Vector<String> getOwners() { return owners; } }
Product定義產品骨架。
Factory定義工廠生產過程骨架。
IDCard具體實現產品的內容。
IDCardFactory具體實現工廠生產IDCard對象實例。ide
public class ContextLoader { protected void configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac, ServletContext sc) { // ... wac.refresh(); // ... } } public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle, Closeable { // ... void refresh() throws BeansException, IllegalStateException; ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException; // ... } public abstract class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext, DisposableBean { // ... public void refresh() throws BeansException, IllegalStateException { // ... ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); } protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { refreshBeanFactory(); ConfigurableListableBeanFactory beanFactory = getBeanFactory(); // ... return beanFactory; } public abstract ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException; // ... } public abstract class AbstractRefreshableApplicationContext extends AbstractApplicationContext { // ... protected final void refreshBeanFactory() throws BeansException { // ... DefaultListableBeanFactory beanFactory = createBeanFactory(); // ... } protected DefaultListableBeanFactory createBeanFactory() { return new DefaultListableBeanFactory(getInternalParentBeanFactory()); } public final ConfigurableListableBeanFactory getBeanFactory() { // ... return this.beanFactory; } // ... }
spring框架初始化ApplicationContext建立BeanFactory過程刪減後的骨架。this