一、定義:
????????定義一個用于創建對象的接口,讓子類決定實例化哪個類。
二、組成:
? ? ? ? 1.抽象工廠:工廠模式的核心,聲明工廠方法,返回抽象產品對象。
? ? ? ? 2.具體工廠:實現工廠方法,返還具體的產品對象。
? ? ? ? 3.抽象產品:定義產品的相關接口。
? ? ? ? 4.具體產品:實現抽象產品的具體類。
三、具體例子:
? ? ? ? 抽象產品
????????public abstract class Product {
? ? ? ? ????????public abstract void method();
????????}
? ? ? ? 具體產品A
????????public class ConcreteProductA extends Product?{
? ? ? ? ? ? ? ? @Override
????????????????public void method(){
? ? ? ? ? ? ? ? ? ? ? ? System.out.printn("I'm product A");
????????????????}
????????}
? ? ? ? 具體產品B
????????public class ConcreteProductB extends Product?{
? ? ? ? ? ? ? ? @Override
????????????????public void method(){
? ? ? ? ? ? ? ? ? ? ? ? System.out.printn("I'm product B");
????????????????}
????????}
? ? ? ? 抽象工廠
? ? ? ? public abstract class Factory{
? ? ? ? ? ? ? ? public abstract? <T extends Product> createProduct(Class<T> clz);
????????}
? ? ? ? 具體工廠
? ? ? ? public class ConcreteFactory extends Factory{
? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? public <T extends Procut> createProduct(Class<T> clz){
? ? ? ? ? ? ? ? ? ? ? ? Product p = null;
? ? ? ? ? ? ? ? ? ? ? ? try{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? p? = (Product) Class.forName(clz.getName()).newInstance();
????????????????????????} catch (Exception e){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? e.printStackTrace();
????????????????????????}
????????????????}
????????}
? ? ? ? 客戶端使用
? ? ? ? public class Client{
? ? ? ? ? ? ? ? public static void main(String[] args){
? ? ? ? ? ? ? ? ? ? ? ? Factory factory = new ConcreteFactory();
? ? ? ? ? ? ? ? ? ? ? ? Product p = factory.createProduct(ConcreteProductB.class);
? ? ? ? ? ? ? ? ? ? ? ? p.method();
????????????????}??
????????}
四、應用場景:
? ? ? ? 1.創建復雜對象:BitmapFactory
? ? ? ? 2.動態加載布局:LayoutInflater的inflate()
? ? ? ? 3.Fragment實例化:重寫onCreateView方法創建具體的view
? ? ? ? 4.MVP/MVVM架構中的對象創建:使用工廠方法創建Presenter或viewModel,避免直接new 對象
五、優缺點:
優點
????????解耦:將對象創建邏輯與業務代碼分離
????????擴展性:新增產品類型只需要增加新工廠類,符合開閉原則
? ? ? ? 統一管理:集中控制對象的創建過程
缺點
? ? ? ? 類數量增加:每增加一個產品,需要新增對于的工廠類
? ? ? ? 復雜度提升:對簡單對象創建顯得冗余