1.工廠方法模式介紹
工廠方法模式是一種結構簡單的模式抛丽,其在我們平時開發(fā)中應用很廣泛冤吨,也許你并不知道垒探,但是你已經使用了無數(shù)次該模式了圾叼,如activity里的各個生命周期方法,以onCreate為例,他就可以看作是一個工廠方法,我們在其中可以構造我們的view呜笑,并通過setContentView()返回給framework處理等驼鹅。
2.工廠方法模式的定義
定義一個用于創(chuàng)建對象的接口,讓子類決定實例化那個類。
3.工廠方法模式的使用場景
在任何需要生成復雜對象的地方,都可以使用工廠方法模式,復雜對象適合使用工廠模式,用new就可以完成創(chuàng)建的對象無需使用工廠模式娶眷。
4.工廠模式的簡單用例
public abstract class Product {
/**
* 產品類的抽象方法
* 有具體的產品類去實現(xiàn)
*/
public abstract void method();
}
public class ConcreateProductA extends Product {
@Override
public void method() {
System.out.print("我是具體產品A");
}
}
public class ConcreateProductB extends Product {
@Override
public void method() {
System.out.print("我是具體產品B");
}
}
public abstract class Factory {
/**
* 抽象工廠類
* 具體產生什么由子類去實現(xiàn)
* @return
*/
public abstract Product createProduct();
}
public class ConcreteFactory extends Factory {
@Override
public Product createProduct() {
return new ConcreateProductA();
}
}
public class Client {
public static void main(String[] agrs) {
Factory factory = new ConcreteFactory();
Product product = factory.createProduct();
product.method();
}
}
四大模塊:
抽象工廠:工廠方法模式的核心届宠;
具體工廠:實現(xiàn)具體的業(yè)務邏輯幌羞;
抽象產品:工廠方法模式創(chuàng)建的產品的父類聂宾;
具體產品:實現(xiàn)抽象產品的某個具體產品的對象;
這種方法比較常見系谐,需要哪一個產品就生產那個,有時候也可以利用反射方式更簡潔的來生成具體產品對象,此時,需要在工廠方法的參數(shù)列表中傳入一個class類來決定是哪一個產品類植康。
public abstract class Factory1 {
/**
* 抽象工廠類
* 具體產生什么由子類去實現(xiàn)
*
* @return
*/
public abstract <V extends Product> V createProduct(Class<V> clz);
}
public class ConcreteFactory1 extends Factory1 {
@Override
public <T extends Product> T createProduct(Class<T> clz) {
Product p = null;
try {
p = (Product) Class.forName(clz.getName()).newInstance();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return (T) p;
}
}
再來看看具體的Client中的實現(xiàn)
public class Client {
public static void main(String[] agrs) {
Factory factory = new ConcreteFactory();
Product product = factory.createProduct();
product.method();
Factory1 factory1 = new ConcreteFactory1();
Product product1 = factory1.createProduct(ConcreateProductA.class);
product1.method();
}
}
需要哪一個類的對象就傳入哪一個類的對象旷太,這種方法比較簡潔展懈,動態(tài)销睁,如果你不喜歡這種方式,以惡可以嘗試每一個產品定義一個具體的工廠存崖,各司其職冻记。
像這樣擁有多個工廠的方式我們稱為工廠方法模式。它降低了對象之間的耦合度来惧,而且冗栗,工廠方法模式依賴于抽象的架構,其將實例化的任務交由子類去完成供搀,有非常好的擴展性隅居。