工廠方法模式定義:用於建立對象的接口,讓子類決定實例化哪一個類。java
一種工廠模式的例子。ide
抽象產品類spa
public abstract class Product { public void method1(){ // 業務邏輯 } public abstract void method2(); }
具體產品類code
public class CreateProduct1 extends Product { @Override public void method2() { } }
public class CreateProduct extends Product { @Override public void method2() { } }
抽象工廠類對象
public abstract class Creator { public abstract < T extends Product> T createProduct(Class<T> c); }
具體工廠實現類接口
public class ConcreteCreator extends Creator { @Override public <T extends Product> T createProduct(Class<T> c) { Product product = null; try{ product = (Product)Class.forName(c.getName()).newInstance(); }catch (Exception e){ } return (T)product; } }
調用端get
public class Client { public static void main(String args[]){ Creator creator = new ConcreteCreator(); Product product = creator.createProduct(CreateProduct1.class); } }
工廠方法模式擴展產品
簡單工廠模式(靜態工廠模式)
io
public class ConcreteCreatorExt { public static <T extends Product> T createProduct(Class<T> c) { Product product = null; try{ product = (Product)Class.forName(c.getName()).newInstance(); }catch (Exception e){ } return (T)product; } }
2.替代單例模式class
public class Singleton1 { private Singleton1(){ } public void doSomething{ } }
public class SingletonFactory { private static Singleton1 singleton; static { try { Class c1 = Class.forName(Singleton1.class.getName()); Constructor constructor = c1.getConstructor(); constructor.setAccessible(true); singleton = (Singleton1)constructor.newInstance(); }catch (Exception e){ } } public static Singleton1 getSingleton(){ return singleton; } }
3.延遲初始化
一個對象被消費完畢後,並不馬上釋放,工廠類保持其初始化狀態,等待再次被調用。
public class ProductFactory { private static final Map<String,Product> map = new HashMap(); public static synchronized Product createProduct(String type) throws Exception{ Product product = null; if(map.containsKey(type)){ product = map.get(type); }else{ product = new CreateProduct(); map.put(type,product); } return product; } }
抽象工廠模式:爲建立一組相關或相互依賴的對象提供一個接口,而且無需指定他們的具體的實現類。
通用代碼:
抽象product A
public abstract class AbstractProductA { // public void shareMethod(){ // 業務邏輯 } public abstract void method2(); }
具體實現類
public class ProductA1 extends AbstractProductA { @Override public void method2() { } }
public class ProductA2 extends AbstractProductA { @Override public void method2() { } }
抽象product B
public abstract class AbstractProductB { // public void shareMethod(){ // 業務邏輯 } public abstract void method2(); }
具體實現類
public class ProductB1 extends AbstractProductB { @Override public void method2() { } }
抽象建立類
public abstract class AbstractCreator { public abstract AbstractProductA createProductA(); public abstract AbstractProductB createProductB(); }
具體實現類
public class Creator1 extends AbstractCreator { @Override public AbstractProductA createProductA() { return new ProductA1(); } @Override public AbstractProductB createProductB() { return new ProductB1(); } }