目錄
- 一、概述
- 1.1 什么是Java工廠模式
- 二、簡單工廠
- 2.1 什么是簡單工廠
- 2.2 示例代碼
- 2.3 優點和缺點
- 三、工廠方法
- 3.1 什么是工廠方法
- 3.2 示例代碼
- 3.3 優點和缺點
- 四、抽象工廠
- 4.1 什么是抽象工廠
- 4.2 示例代碼
- 4.3 優點和缺點
- 4.4 使用工廠模式的例子
一、概述
1.1 什么是Java工廠模式
Java工廠模式是一種創建對象的設計模式,它提供了一種方法,通過該方法可以在不暴露對象創建邏輯的情況下,將對象的創建委托給子類或者其他對象。工廠模式可以隱藏對象的創建細節,提高了代碼的可維護性、可擴展性和可重用性。
工廠模式主要有三種類型:簡單工廠、工廠方法和抽象工廠。這三種類型的工廠模式各有優缺點,在不同的場景下有不同的應用。
二、簡單工廠
2.1 什么是簡單工廠
簡單工廠模式是一種創建對象的工廠模式,它定義了一個工廠類,該工廠類根據傳遞的參數來決定創建哪種類型的對象。簡單工廠模式適用于創建的對象比較少,且客戶端只需要知道創建對象的參數。
2.2 示例代碼
//抽象產品類 interface Product { void show(); } //具體產品類A class ConcreteProductA implements Product { public void show() { System.out.println("This is product A"); } } //具體產品類B class ConcreteProductB implements Product { public void show() { System.out.println("This is product B"); } } //工廠類 class SimpleFactory { public static Product createProduct(String type) { Product product = null; if (type.equals("A")) { product = new ConcreteProductA(); } else if (type.equals("B")) { product = new ConcreteProductB(); } return product; } } //客戶端 public class Client { public static void main(String[] args) { Product productA = SimpleFactory.createProduct("A"); productA.show(); Product productB = SimpleFactory.createProduct("B"); productB.show(); } }
2.3 優點和缺點
簡單工廠模式的優點是可以隱藏產品的創建細節,客戶端不需要知道產品的創建過程,只需要傳遞相應的參數即可得到想要的產品。簡單工廠模式可以使客戶端和產品類解耦,提高代碼的可維護性和可擴展性。
簡單工廠模式的缺點是當需要新增產品時,需要修改工廠類的代碼,這違反了開閉原則。另外,簡單工廠模式通常只有一個工廠類,如果產品種類較多,工廠類的代碼會變得比較臃腫,不易于維護。
三、工廠方法
3.1 什么是工廠方法
工廠方法模式是一種創建對象的工廠模式,它定義了一個抽象工廠類,該抽象工廠類有一個工廠方法,該工廠方法返回一個產品對象。具體的產品對象由實現該抽象工廠類的子類來創建,這樣每個具體工廠類只負責創建特定的產品對象,從而將客戶端和具體產品解耦。
工廠方法模式通常包括四個角色:抽象產品類、具體產品類、抽象工廠類和具體工廠類。
3.2 示例代碼
//抽象產品類 interface Product { void show(); } //具體產品類A class ConcreteProductA implements Product { public void show() { System.out.println("This is product A"); } } //具體產品類B class ConcreteProductB implements Product { public void show() { System.out.println("This is product B"); } } //抽象工廠類 interface Factory { Product createProduct(); } //具體工廠類A class ConcreteFactoryA implements Factory { public Product createProduct() { return new ConcreteProductA(); } } //具體工廠類B class ConcreteFactoryB implements Factory { public Product createProduct() { return new ConcreteProductB(); } } //客戶端 public class Client { public static void main(String[] args) { Factory factoryA = new ConcreteFactoryA(); Product productA = factoryA.createProduct(); productA.show(); Factory factoryB = new ConcreteFactoryB(); Product productB = factoryB.createProduct(); productB.show(); } }
3.3 優點和缺點
工廠方法模式的優點是可以將客戶端和具體產品解耦,每個具體工廠類只負責創建特定的產品對象,從而使系統更加靈活、可擴展和易于維護。工廠方法模式遵循了開閉原則,當需要新增產品時,只需要添加相應的具體產品類和具體工廠類即可,而不需要修改抽象工廠類和客戶端代碼。
工廠方法模式的缺點是如果需要創建的產品對象比較多,就需要創建相應的具體工廠類,這會導致系統中類的個數增加,增加了系統的復雜度。另外,由于每個具體工廠類只能創建特定的產品對象,如果需要創建的產品對象較為復雜,可能需要創建多個具體工廠類來創建這些產品對象,這會導致代碼的重復和冗余。
四、抽象工廠
4.1 什么是抽象工廠
抽象工廠模式是一種創建對象的工廠模式,它可以創建一組相關或相互依賴的對象,而無需指定它們的具體類。在抽象工廠模式中,有一個抽象工廠類,它定義了一些方法用于創建一組產品對象,每個方法對應一種產品。具體工廠類實現了這些方法,用于創建具體的產品對象。
抽象工廠模式通常包括四個角色:抽象產品類、具體產品類、抽象工廠類和具體工廠類。
4.2 示例代碼
//抽象產品類1 interface Product1 { void show(); } //具體產品類1A class ConcreteProduct1A implements Product1 { public void show() { System.out.println("This is product 1A"); } } //具體產品類1B class ConcreteProduct1B implements Product1 { public void show() { System.out.println("This is product 1B"); } } //抽象產品類2 interface Product2 { void show(); } //具體產品類2A class ConcreteProduct2A implements Product2 { public void show() { System.out.println("This is product 2A"); } } //具體產品類2B class ConcreteProduct2B implements Product2 { public void show() { System.out.println("This is product 2B"); } } //抽象工廠類 interface Factory { Product1 createProduct1(); Product2 createProduct2(); } //具體工廠類A class ConcreteFactoryA implements Factory { public Product1 createProduct1() { return new ConcreteProduct1A(); } public Product2 createProduct2() { return new ConcreteProduct2A(); } } //具體工廠類B class ConcreteFactoryB implements Factory { public Product1 createProduct1() { return new ConcreteProduct1B(); } public Product2 createProduct2() { return new ConcreteProduct2B(); } } //客戶端 public class Client { public static void main(String[] args) { Factory factoryA = new ConcreteFactoryA(); Product1 product1A = factoryA.createProduct1(); Product2 product2A = factoryA.createProduct2(); product1A.show(); product2A.show(); Factory factoryB = new ConcreteFactoryB(); Product1 product1B = factoryB.createProduct1(); Product2 product2B = factoryB.createProduct2(); product1B.show(); product2B.show(); } }
4.3 優點和缺點
抽象工廠模式的優點是它可以創建一組相關或相互依賴的對象,而無需指定它們的具體類,從而使系統更加靈活、可擴展和易于維護。抽象工廠模式遵循了開閉原則,當需要新增產品時,只需要添加相應的抽象產品類、具體產品類和具體工廠類即可,不需要修改已有代碼,這樣可以減少系統的維護成本和風險。
抽象工廠模式還可以實現產品族的概念,即一組位于不同產品等級結構中、功能相關聯的產品組成的家族,例如不同品牌的汽車,它們都有輪胎、發動機、座椅等共同特點,但具體實現各不相同。使用抽象工廠模式可以將不同品牌的汽車組成一個產品族,實現同一功能的產品可以進行互換。
抽象工廠模式的缺點是抽象工廠類需要定義一組方法用于創建產品對象,增加新產品對象時,需要修改抽象工廠類及其所有的具體工廠類,這將導致系統的維護復雜度增加。抽象工廠模式將一組相關的產品對象集合在一起創建,當產品族中的產品等級結構發生變化時,將會影響到整個系統,需要重構整個工廠。
4.4 使用工廠模式的例子
一個常見的使用抽象工廠模式的例子是操作系統的界面風格,例如Windows系統有Aero和Classic兩種界面風格,而Mac OS有Aqua和Metal兩種界面風格。每種界面風格都有自己的按鈕、文本框、滾動條等組件,因此可以將每種界面風格看作一個產品族,而每個組件則看作產品等級結構中的一個產品。使用抽象工廠模式可以將不同界面風格的組件組成一個產品族,實現同一功能的組件可以進行互換。例如,用戶可以選擇使用Aero風格的按鈕和Metal風格的文本框,而系統仍然能夠正常工作。
另一個使用抽象工廠模式的例子是游戲中的角色創建,例如一個RPG游戲中有魔法師、戰士和弓箭手三種角色,而每種角色又可以選擇不同的裝備,例如不同的武器、防具和飾品。可以將每種角色看作一個產品族,而每個裝備則看作產品等級結構中的一個產品。使用抽象工廠模式可以將不同角色的裝備組成一個產品族,實現同一功能的裝備可以進行互換。例如,魔法師可以選擇使用火屬性的魔杖和光屬性的魔法書,而戰士可以選擇使用鐵劍和鋼盾,而系統仍然能夠正常工作。
原文地址:https://juejin.cn/post/7229891190899785765