目錄
1、介紹
1.1、定義
1.2、優缺點
1.3、使用場景
2、實現
2.1、簡單工廠模式
2.2、工廠方法模式
2.3、抽象工廠模式
3、小結
前言
????????在面向對象編程中,創建對象實例最常用的方式就是通過 new 操作符構造一個對象實例,但在某些情況下,new 操作符直接生成對象會存在一些問題。
舉例來說,對象的創建需要一系列的步驟:
????????可能需要計算或取得對象的初始位置、選擇生成哪個子對象實例、或在生成之前必須先生成一些輔助對象。
???????? 在這些情況,新對象的建立就是一個 “過程”,而不僅僅是一個操作,就像一部大機器中的一個齒輪傳動。
????????工廠模式是一種創建型設計模式,它提供了一種創建對象的最佳方式,而無需指定具體的實現類。
Java設計模式分類,如下所示:
1、介紹
1.1、定義
?????????工廠模式將目的將創建對象的具體過程屏蔽隔離起來,從而達到更高的靈活性。
如下所示:
工廠模式可以分為三類:
- 簡單工廠模式(Simple Factory)
- 工廠方法模式(Factory Method)
- 抽象工廠模式(Abstract Factory)
1、在沒有工廠的時代:
如果客戶需要一款寶馬車,那么就需要客戶去創建一款寶馬車,然后拿來用。
2、簡單工廠模式:
????????后來出現了工廠,用戶不再需要去創建寶馬車,由工廠進行創建,想要什么車,直接通過工廠創建就可以了。比如想要320i系列車,工廠就創建這個系列的車。
3、工廠方法模式:
????????為了滿足客戶,寶馬車系列越來越多,如320i、523i等等系列,一個工廠無法創建所有的寶馬系列,于是又單獨分出來多個具體的工廠,每個具體工廠創建一種系列,即具體工廠類只能創建一個具體產品。但是寶馬工廠還是個抽象,你需要指定某個具體的工廠才能生產車出來。
4、抽象工廠模式:
????????隨著客戶要求越來越高,寶馬車必須配置空調,于是這個工廠開始生產寶馬車和需要的空調。最終是客戶只要對寶馬的銷售員說:我要523i空調車,銷售員就直接給他523i空調車了。而不用自己去創建523i空調車寶馬車。
1.2、優缺點
-
將對象的創建與使用分離。
-
降低系統的耦合度。
-
便于擴展新的產類型。
1.3、使用場景
-
如果只是創建單個對象的不同實現(如不同的數據庫連接),用工廠方法。
-
如果需要創建配套的一組對象(如不同操作系統的UI組件套件),用抽象工廠。
2、實現
2.1、簡單工廠模式
// 產品接口
interface Product {void use();
}// 具體產品A
class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("Using Product A");}
}// 具體產品B
class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("Using Product B");}
}// 簡單工廠
class SimpleFactory {public static Product createProduct(String type) {if ("A".equals(type)) {return new ConcreteProductA();} else if ("B".equals(type)) {return new ConcreteProductB();}throw new IllegalArgumentException("Unknown product type");}
}// 使用示例
public class Main {public static void main(String[] args) {Product productA = SimpleFactory.createProduct("A");productA.use(); // 輸出: Using Product AProduct productB = SimpleFactory.createProduct("B");productB.use(); // 輸出: Using Product B}
}
2.2、工廠方法模式
相比較于抽象工廠模式,可以對接口的實現縱向擴展。
// 產品接口
interface Engine {void start();
}// 具體產品
class ElectricEngine implements Engine {public void start() { System.out.println("電動機啟動"); }
}class FuelEngine implements Engine {public void start() { System.out.println("燃油發動機啟動"); }
}// 工廠接口(只生產發動機)
interface EngineFactory {Engine createEngine();
}// 具體工廠
class ElectricEngineFactory implements EngineFactory {public Engine createEngine() { return new ElectricEngine(); }
}class FuelEngineFactory implements EngineFactory {public Engine createEngine() { return new FuelEngine(); }
}// 使用示例
public class Main {public static void main(String[] args) {EngineFactory ef = new ElectricEngineFactory();Engine engine = ef.createEngine();engine.start(); // 輸出: 電動機啟動}
}
特點:
-
只生產發動機這一種產品
-
如果要新增空調組件,需要另寫一套空調工廠
2.3、抽象工廠模式
相比于工廠方法模式,抽象工廠模式,可以橫向擴展。
// 產品族接口
interface Engine {void start();
}interface AirConditioner {void cool();
}// 電動系列產品
class ElectricEngine implements Engine {public void start() { System.out.println("電動機啟動"); }
}class ElectricAirConditioner implements AirConditioner {public void cool() { System.out.println("電子變頻空調工作"); }
}// 燃油系列產品
class FuelEngine implements Engine {public void start() { System.out.println("燃油發動機啟動"); }
}class FuelAirConditioner implements AirConditioner {public void cool() { System.out.println("機械壓縮機空調工作"); }
}// 抽象工廠接口(能生產整套組件)
interface CarFactory {Engine createEngine();AirConditioner createAirConditioner();
}// 具體工廠
class ElectricCarFactory implements CarFactory {public Engine createEngine() { return new ElectricEngine(); }public AirConditioner createAirConditioner() { return new ElectricAirConditioner(); }
}class FuelCarFactory implements CarFactory {public Engine createEngine() { return new FuelEngine(); }public AirConditioner createAirConditioner() { return new FuelAirConditioner(); }
}// 使用示例
public class Main {public static void main(String[] args) {CarFactory cf = new ElectricCarFactory();Engine engine = cf.createEngine();AirConditioner ac = cf.createAirConditioner();engine.start(); // 輸出: 電動機啟動ac.cool(); // 輸出: 電子變頻空調工作}
}
特點:
-
一個工廠能生產配套的發動機+空調
-
保證電動車的發動機和空調是電子化的,燃油車的都是機械化的
3、小結
1、簡單工廠模式:
一個工廠類根據傳入的參數決定創建哪種產品類的實例。
2、工廠方法模式:
定義一個創建對象的接口,但讓實現這個接口的類來決定實例化哪個類。
3、抽象工廠模式:
提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
參考文章:
1、Java設計模式之創建型:工廠模式詳解(簡單工廠+工廠方法+抽象工廠)_簡單工廠模式,工廠方法模式,抽象工廠模式-CSDN博客https://blog.csdn.net/a745233700/article/details/120253639?ops_request_misc=%257B%2522request%255Fid%2522%253A%252227ffb8b4a369e0e5024f4e17abda46f3%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=27ffb8b4a369e0e5024f4e17abda46f3&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-120253639-null-null.142^v102^pc_search_result_base1&utm_term=%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4187