public abstract class Product { /** * 公共邏輯方法 */
public void method1(){} /** * 抽象方法:由子類實現,根據業務邏輯定義多個 */
public abstract void method2(); }
public class Product1 extends Product { /** * 實現抽象產品類的抽象方法 */ @Override public void method2() { } }
public class Product2 extends Product { /** * 實現抽象產品類的抽象方法 */ @Override public void method2() { } }
public abstract class AbstractFactory { /** * 工廠方法,須要子類實現 * @param cls * @param <T> * @return */
public abstract <T extends Product> T create(Class<T> cls); }
public class ConcreteFactory extends AbstractFactory { @Override public <T extends Product> T create(Class<T> cls) { Product product=null; try{ product= (Product) Class.forName(cls.getName()).newInstance(); }catch (Exception ex){ ex.printStackTrace(); } return (T) product; } }
public static void main(String[] args) { //建立具體工廠類
ConcreteFactory factory = new ConcreteFactory(); //調用工廠方法獲取產品類1的實例
Product1 product1 = factory.create(Product1.class); System.out.println(product1); }
public abstract class AbstractFactory { /** * 工廠方法,須要子類實現 */
public abstract <T extends Product> T create(); }
public final T getObject() throws Exception { //單例,從緩存中取,或者暴露一個早期實例解決循環引用
if (isSingleton()) { return (this.initialized ? this.singletonInstance : getEarlySingletonInstance()); } //多實例
else { //調用createInstance
return createInstance(); } } //建立對象
protected abstract T createInstance() throws Exception;