深入探析設計模式:工廠模式的三種姿態
- 1. 簡單工廠模式
- 1.1 概念
- 1.2 案例
- 1.3 優缺點
- 2. 抽象工廠模式
- 2.1 概念
- 2.2 案例:跨品牌手機生產
- 2.3 優缺點
- 3. 超級工廠模式
- 3.1 概念
- 3.2 案例:動物園游覽
- 3.3 優缺點
- 4. 總結
歡迎閱讀本文,今天我們將會深入學習工廠模式,這是一種重要的設計模式,用于創建對象的實例化過程。我們將分析三種工廠模式的用法:簡單工廠模式、抽象工廠模式和超級工廠模式,并通過實際案例幫助您了解如何在實際開發中應用這些模式。
1. 簡單工廠模式
1.1 概念
簡單工廠模式(Simple Factory Pattern)是最基礎的工廠模式,它通過一個工廠類根據不同的參數來創建不同類的實例。讓我們通過一個例子來理解簡單工廠模式。
1.2 案例
假設我們有不同類型的汽車:轎車、越野車和卡車。我們可以創建一個汽車工廠,根據用戶的選擇來制造不同類型的汽車。
class CarFactory {public Car createCar(String type) {if ("sedan".equals(type)) {return new SedanCar();} else if ("suv".equals(type)) {return new SuvCar();} else if ("truck".equals(type)) {return new TruckCar();} else {throw new IllegalArgumentException("Unknown car type");}}
}interface Car {void drive();
}class SedanCar implements Car {public void drive() {System.out.println("Driving a sedan car");}
}class SuvCar implements Car {public void drive() {System.out.println("Driving an SUV car");}
}class TruckCar implements Car {public void drive() {System.out.println("Driving a truck car");}
}public class Main {public static void main(String[] args) {CarFactory carFactory = new CarFactory();Car sedan = carFactory.createCar("sedan");Car suv = carFactory.createCar("suv");Car truck = carFactory.createCar("truck");sedan.drive();suv.drive();truck.drive();}
}
這個案例中,CarFactory
根據用戶的選擇來創建不同類型的汽車實例。這是最簡單的工廠模式,但它的缺點是新增汽車類型時,需要修改工廠類。
1.3 優缺點
- 優點:
- 簡單易用:簡單工廠模式的實現相對簡單,適用于創建單一類型的對象。
- 封裝創建邏輯:工廠類封裝了對象的創建邏輯,客戶端只需提供參數即可獲得所需對象。
- 解耦:客戶端與具體產品類之間解耦,降低客戶端與具體類的依賴性。
- 缺點:
- 不易擴展:當需要新增產品時,需要修改工廠類的代碼,違反了開閉原則。
- 代碼維護難:隨著產品種類增加,共產類的代碼會變得臃腫,難以維護。
- 違背單一職責原則:工廠類負責了對象的創建和邏輯判斷,導致職責不清晰。
2. 抽象工廠模式
2.1 概念
抽象工廠模式(Abstract Factory Pattern)是對簡單工廠模式的進一步抽象,它提供了一個抽象的工廠接口,每個具體的工廠類實現這個接口以創建一系列相關或依賴對象的實例。讓我們通過一個例子理解抽象工廠模式。
2.2 案例:跨品牌手機生產
假設我們要生產手機,分為不同品牌和型號。我們可以創建一個抽象的工廠接口,不同的品牌工廠實現這個接口來生產不同型號的手機。
interface PhoneFactory {SmartPhone createSmartPhone();FeaturePhone createFeaturePhone();
}class AppleFactory implements PhoneFactory {public SmartPhone createSmartPhone() {return new IPhone();}public FeaturePhone createFeaturePhone() {return new IPod();}
}class SamsungFactory implements PhoneFactory {public SmartPhone createSmartPhone() {return new Galaxy();}public FeaturePhone createFeaturePhone() {return new OldPhone();}
}interface SmartPhone {void makeCall();void sendText();
}interface FeaturePhone {void makeCall();
}class IPhone implements SmartPhone {public void makeCall() {System.out.println("Calling from iPhone");}public void sendText() {System.out.println("Sending text from iPhone");}
}class Galaxy implements SmartPhone {public void makeCall() {System.out.println("Calling from Galaxy");}public void sendText() {System.out.println("Sending text from Galaxy");}
}class IPod implements FeaturePhone {public void makeCall() {System.out.println("Calling from iPod");}
}class OldPhone implements FeaturePhone {public void makeCall() {System.out.println("Calling from old phone");}
}public class Main {public static void main(String[] args) {PhoneFactory appleFactory = new AppleFactory();SmartPhone iphone = appleFactory.createSmartPhone();FeaturePhone ipod = appleFactory.createFeaturePhone();PhoneFactory samsungFactory = new SamsungFactory();SmartPhone galaxy = samsungFactory.createSmartPhone();FeaturePhone oldPhone = samsungFactory.createFeaturePhone();iphone.makeCall();ipod.makeCall();galaxy.makeCall();oldPhone.makeCall();}
}
在這個案例中,PhoneFactory
是抽象工廠接口,不同的品牌工廠類如AppleFactory
和SamsungFactory
實現了這個接口。每個工廠類都可以創建不同品牌手機的實例。
2.3 優缺點
- 優點:
- 封裝產品族創建邏輯:抽象工廠模式將一系列相關的產品組成一個產品族,工廠類負責創建整個產品族的對象。
- 滿足開閉原則:新增產品時只需要擴展抽象工廠及其具體子類,不需要修改已有代碼。
- 解耦產品類和客戶端:客戶端通過工廠接口而不是具體類來創建對象,降低了依賴。
- 缺點:
- 不易擴展新產品等級:當需要新增產品等級時,需要修改所有具體工廠類的代碼。
- 復雜性增加:隨著產品族和產品等級的增加,工廠和產品類的數量會增加,導致負責性提高。
3. 超級工廠模式
3.1 概念
超級工廠模式是將多個工廠模式結合在一起,形成一個層次結構的工廠模式。它可以根據不同的條件選擇合適的子工廠來創建對象。讓我們通過一個例子了解超級工廠模式。
3.2 案例:動物園游覽
假設我們要構建一個動物園游覽系統,需要創建各種動物的實例。我們可以使用超級工廠模式來管理不同種類的工廠,每個工廠負責創建一類動物。
// 動物接口
interface Animal {void makeSound();
}// 具體動物
class Lion implements Animal {public void makeSound() {System.out.println("Lion is roaring");}
}class Elephant implements Animal {public void makeSound() {System.out.println("Elephant is trumpeting");}
}class Dolphin implements Animal {public void makeSound() {System.out.println("Dolphin is squeaking");}
}// 動物工廠接口
interface AnimalFactory {Animal createAnimal();
}// 具體動物工廠
class LionFactory implements AnimalFactory {public Animal createAnimal() {return new Lion();}
}class ElephantFactory implements AnimalFactory {public Animal createAnimal() {return new Elephant();}
}class DolphinFactory implements AnimalFactory {public Animal createAnimal() {return new Dolphin();}
}public class Main {public static void main(String[] args) {AnimalFactory lionFactory = new LionFactory();AnimalFactory elephantFactory = new ElephantFactory();AnimalFactory dolphinFactory = new DolphinFactory();Animal lion = lionFactory.createAnimal();Animal elephant = elephantFactory.createAnimal();Animal dolphin = dolphinFactory.createAnimal();lion.makeSound();elephant.makeSound();dolphin.makeSound();}
}
在這個案例中,AnimalFactory
是超級工廠接口,每個具體的動物工廠類如LionFactory
、ElephantFactory
和DolphinFactory
都實現了這個接口。通過不同的工廠,我們可以創建不同種類的動物。
3.3 優缺點
- 優點:
- 更高層次的封裝:超級工廠模式將多個工廠模式結合在一起,提供更高層次的封裝和抽象。
- 根據條件選擇:根據不同條件選擇合適的子工廠來創建對象,增加了靈活性和可擴展性。
- 滿足開閉原則:當新增工廠或產品時,不需要修改已有代碼,符合開閉原則。
- 缺點:
- 復雜性增加:超級工廠模式會引入更多的工廠類,可能會增加系統的復雜性。
- 不同工廠間的耦合:超級工廠模式可能會導致不同工廠之間的耦合,影響系統的維護和擴展。
4. 總結
工廠模式是面向對象設計中的重要模式之一,它能夠將對象的創建和使用分離,提高代碼的靈活性和可維護性。通過簡單工廠模式、抽象工廠模式和超級工廠模式,我們可以根據不同的需求來選擇合適的模式來創建對象。在實際開發中,根據具體情況選擇合適的工廠模式可以使代碼更加模塊化、可擴展和易于維護。