什么是工廠模式?
工廠模式是一種設計模式,它利用工廠類來創建物件,而不是在程式中直接實體化物件,
工廠模式可以隱藏創建物件的具體細節,提高代碼可維護性和可擴展性,
其核心思想是將物件的創建與具體實作分離開來,通過工廠類統一管理物件的創建,使得客戶端無需了解創建物件的具體實作,
工廠類根據客戶端請求的不同,回傳不同的物件實體,
工廠模式主要包括三種方式:簡單工廠模式、工廠方法模式和抽象工廠模式,
什么是簡單工廠模式?
簡單工廠模式(Simple Factory Pattern),又稱靜態工廠模式,是一種常見的設計模式之一,它是由一個工廠物件決定創建出哪一種產品類的實體,而客戶端不需要知道具體實作類的類名,只需要知道所需產品的型別即可,
簡單工廠模式的核心思想是將多個具有共同特征的產品類抽象成一個產品類,并創建一個工廠類來生成這些產品的實體,
這樣,客戶端只需要傳遞一個引數給工廠類即可實作創建實體的功能,使得客戶端與具體實作類解耦,使得后期維護更加方便,
好比去餐廳吃飯,你只需要跟服務員點菜(請求產品),告訴服務員你想要吃什么菜(指定物件型別),服務員就會為你送上菜(回傳物件),
你不需要知道菜是如何做出來的(物件是如何創建的),只需要享受美食,
這就是簡單工廠模式對于物件的創建程序進行了封裝,讓使用者不需要知道具體的實作程序,更加方便快捷,
// 定義產品抽象類
abstract class Product {
public abstract void use();
}
// 定義具體產品類
class ProductA extends Product {
public void use() {
System.out.println("使用產品A");
}
}
class ProductB extends Product {
public void use() {
System.out.println("使用產品B");
}
}
// 定義工廠類
class Factory {
public static Product createProduct(String type) {
if (type.equals("A")) {
return new ProductA();
} else if (type.equals("B")) {
return new ProductB();
} else {
return null;
}
}
}
// 客戶端使用工廠來創建產品實體
public static void main(String[] args) {
Product product = Factory.createProduct("A");
product.use();
}
簡單工廠模式的優點和缺點
簡單工廠模式(Simple Factory Pattern)是一種創建型設計模式,它提供了一種簡單、通用的方式來創建物件,實作了對客戶端代碼的解耦使得客戶端不需要知道物件的具體實作,下面分別詳細介紹簡單工廠模式的優點和缺點,以及分別用Java偽代碼演示,
優點:
1. 降低客戶端的耦合度:客戶端只需要知道工廠類即可,不需要知道具體的產品類,使得客戶端代碼與具體類的實作解耦,
2. 客戶端不需要知道物件的創建程序:只需要知道工廠類提供的介面即可,無需了解具體物件的創建程序,使得客戶端更加容易使用產品類,
3. 工廠方法有利于橫向擴展:可以很容易擴展出新的產品類,只需要撰寫新的產品子類和工廠方法即可,
缺點:
1. 工廠類的職責相對較重,不易于擴展:如果需要添加新的產品類,需要修改工廠類的代碼,可能會引起潛在的風險,
2. 不符合開閉原則:增加新的產品需要修改工廠類的代碼,不符合開閉原則,
3. 簡單工廠類只能創建單一型別的產品,無法滿足多種產品的需求,
Java偽代碼演示簡單工廠模式
//先定義一個抽象產品介面:
public interface Product {
void run();
}
//再定義具體產品類:
public class ProductA implements Product {
@Override
public void run() {
System.out.println("ProductA is running.");
}
}
public class ProductB implements Product {
@Override
public void run() {
System.out.println("ProductB is running.");
}
}
//定義一個簡單的工廠類:
public class SimpleFactory {
public static Product createProduct(int type) {
if (type == 1) {
return new ProductA();
} else if (type == 2) {
return new ProductB();
} else {
return null;
}
}
}
優點的演示:
public class Client {
public static void main(String[] args) {
Product product = SimpleFactory.createProduct(1);
if (product != null) {
product.run();
} else {
System.out.println("Invalid type.");
}
}
}
這樣就可以實作客戶端代碼與具體類的實作解耦,客戶端只需要知道工廠類即可,
缺點的演示:
public class Client {
public static void main(String[] args) {
Product product = SimpleFactory.createProduct(3);
if (product != null) {
product.run();
} else {
System.out.println("Invalid type.");
}
}
}
當傳入引數為3時,會回傳null,表示無效的型別,這樣就需要修改工廠類的代碼,不符合開閉原則,
簡單工廠模式的組成部分和作業流程是什么?如何創建一個簡單工廠模式
簡單工廠模式的組成部分包括:
- 工廠類:負責創建產品的類,通常是一個靜態工廠方法,根據不同的引數生成不同的產品,
- 抽象產品類:定義產品的抽象方法或介面,是具體產品類的父類,
- 具體產品類:實作抽象產品類定義的方法或介面,是由工廠類創建的產品,
簡單工廠模式的作業流程是:
- 客戶端通過呼叫工廠類的靜態工廠方法并傳遞相應的引數,請求創建產品,
- 工廠類根據傳遞的引數創建對應的具體產品類實體,
- 工廠類將創建的產品回傳給客戶端,
- 客戶端使用產品實體執行相應的操作,
下面是簡單工廠模式的實作步驟:
- 創建一個抽象產品介面:定義了所有產品必須實作的方法,
- 創建具體產品類:實作抽象產品介面,并定義特定于該產品的方法,
- 創建一個工廠類:工廠類包含一個用于創建產品的方法,該方法接受一個引數(通常是一個列舉值或一個字串),根據引數值的不同回傳不同的具體產品物件,
- 在客戶端代碼中使用工廠類:通過呼叫工廠類的靜態方法,根據需要獲取產品,
代碼可參照上一個問題的案例
簡單工廠模式適用于哪些場景
簡單工廠模式適用于以下場景:
- 需要創建的物件較少,通常不超過5個,
- 物件的生成程序比較簡單,只需要根據輸入引數選擇不同的構造方式即可,
- 客戶端不需要知道物件的具體類名,只需要知道物件的型別即可,
- 不需要通過繼承來實作不同產品之間的差異,只需要通過同一個工廠來創建不同型別的產品即可,
- 最初設計時不確定物件會有哪些具體的子類,但仍然需要通過某種方式來創建這些物件,這時可以先在工廠中添加這些物件,后續再根據需求修改工廠的實作,
總之,簡單工廠模式適合于物件較少、生成程序簡單、無需知道具體類名、不需要通過繼承來實作差異、允許動態修改工廠實作等情況,但是,隨著業務增長,可能會變得難以維護,因為所有的創建邏輯都在一個工廠中,容易導致代碼量增加、邏輯復雜等問題,因此,在選擇使用簡單工廠模式時應該注意這些風險,并考慮是否需要更復雜的創建模式來滿足業務需求,
簡單工廠模式客戶端如何處理產品物件的創建例外
簡單工廠模式是一種創建型設計模式,其目的是在不暴露創建邏輯的情況下創建物件,但是,當創建程序中出現例外時,客戶端需要處理例外,以避免應用程式崩潰,
在簡單工廠模式中,客戶端通過工廠類創建產品物件,如果創建程序中出現例外,則工廠類需要拋出例外,客戶端可以捕獲例外,并相應地處理它,
假設有一個形狀工廠類,它可以創建不同型別的形狀,例如圓形、矩形和三角形,客戶端通過提供形狀型別來請求創建相應的形狀物件,
public class ShapeFactory {
public Shape createShape(String shapeType) throws InvalidShapeException {
switch (shapeType) {
case "circle":
return new Circle();
case "rectangle":
return new Rectangle();
case "triangle":
return new Triangle();
default:
throw new InvalidShapeException("Invalid shape type provided: " + shapeType);
}
}
}
在這個工廠類中,如果客戶端提供一個無效的形狀型別,則會拋出一個無效形狀例外(InvalidShapeException),客戶端可以通過捕獲此類例外來處理創建程序中的例外,以下是客戶端如何處理例外的示例偽代碼
try {
ShapeFactory shapeFactory = new ShapeFactory();
Shape circle = shapeFactory.createShape("circle");
Shape rectangle = shapeFactory.createShape("rectangle");
Shape triangle = shapeFactory.createShape("triangle");
Shape square = shapeFactory.createShape("square"); //Invalid Shape Type
} catch (InvalidShapeException e) {
System.out.println(e.getMessage());
}
在上述示例中,當客戶端請求創建一個無效形狀時,工廠類將拋出一個InvalidShapeException,客戶端通過捕獲此例外并列印其訊息來處理創建程序中的例外,
通過這種方式,客戶端可以在簡單工廠模式中處理例外,并且可以使應用程式從例外中恢復,
抽象工廠模式是什么
抽象工廠模式是一種創建型設計模式,它提供介面用于創建一系列相關或依賴物件,而不需要指定它們的具體類,抽象工廠模式允許客戶端使用抽象介面和實作介面分離的方式來創建一組相關的物件,
抽象工廠模式中包含抽象工廠、具體工廠、抽象產品和具體產品四個角色,
- 抽象工廠定義了一組用于創建抽象產品的介面
- 具體工廠實作了抽象工廠中定義的介面,用于生產一組具體產品
- 抽象產品定義了一組用于操作產品的介面
- 具體產品實作了抽象產品中定義的介面,
使用抽象工廠模式,如果需要增加一種產品系列,則只需添加一個新的具體工廠和一組具體產品,而不需要改變已有的代碼,
這種模式可以有效地減少代碼的耦合性,提高系統的擴展性和靈活性,
抽象工廠模式就是一個廠家能夠生產多個系列產品,例如一個化妝品公司可以生產多個系列的護膚品和化妝品,
為了讓生產程序更加標準和規范化,該公司會設計多個生產線,每條生產線專門生產一種系列產品,每條生產線里都有專門的設備和加工工藝,不能互相混用,例如生產基礎護膚品的生產線不能生產高端抗衰老護膚品,
這時,抽象工廠模式就很適用了,該公司設計一個抽象工廠介面,用于生產一類產品,然后各個生產線分別實作該介面,并且生產出來的產品都要符合該介面標準,這樣,不同生產線之間可以互相替換,客戶端也無需知道具體的生產程序,只需通過訪問抽象工廠介面來獲取需要的產品就可以了,
//首先,定義產品族的抽象基類 AbstractProductA 和 AbstractProductB:
public abstract class AbstractProductA {
public abstract void use();
}
public abstract class AbstractProductB {
public abstract void eat();
}
//然后,定義不同產品的具體實作類 ProductA1、ProductA2、ProductB1 和 ProductB2:
public class ProductA1 extends AbstractProductA {
public void use() {
System.out.println("Product A1 is used");
}
}
public class ProductA2 extends AbstractProductA {
public void use() {
System.out.println("Product A2 is used");
}
}
public class ProductB1 extends AbstractProductB {
public void eat() {
System.out.println("Product B1 is eaten");
}
}
public class ProductB2 extends AbstractProductB {
public void eat() {
System.out.println("Product B2 is eaten");
}
}
//接著,定義抽象工廠介面 AbstractFactory,包含用于創建產品族的介面方法:
public interface AbstractFactory {
public AbstractProductA createProductA();
public AbstractProductB createProductB();
}
//然后,定義具體的工廠類 ConcreteFactory1 和 ConcreteFactory2,分別實作 AbstractFactory 介面并實作其中的方法:
public class ConcreteFactory1 implements AbstractFactory {
public AbstractProductA createProductA() {
return new ProductA1();
}
public AbstractProductB createProductB() {
return new ProductB1();
}
}
public class ConcreteFactory2 implements AbstractFactory {
public AbstractProductA createProductA() {
return new ProductA2();
}
public AbstractProductB createProductB() {
return new ProductB2();
}
}
//最后,客戶端只需要訪問抽象工廠介面,具體工廠的實體化和具體產品的創建都被封裝到工廠內部:
public class Client {
public static void main(String[] args) {
AbstractFactory factory1 = new ConcreteFactory1();
AbstractProductA productA1 = factory1.createProductA();
AbstractProductB productB1 = factory1.createProductB();
productA1.use();
productB1.eat();
AbstractFactory factory2 = new ConcreteFactory2();
AbstractProductA productA2 = factory2.createProductA();
AbstractProductB productB2 = factory2.createProductB();
productA2.use();
productB2.eat();
}
}
//輸出結果為:
Product A1 is used
Product B1 is eaten
Product A2 is used
Product B2 is eaten
//這樣,就通過抽象工廠模式創建了不同的產品族,并且客戶端與具體產品類實作解耦了,
抽象工廠模式與簡單工廠模式的區別
抽象工廠模式和簡單工廠模式都是面向物件的創建型設計模式,它們的主要區別在于以下幾個方面:
1.抽象工廠模式可以創建一系列關聯的產品,而簡單工廠只能創建一個產品,
2.在抽象工廠模式中,有多個抽象產品類,每個抽象產品類可以有多個具體產品類實作,而簡單工廠模式中,只有一個抽象產品類和一個具體產品類,
3.抽象工廠模式通常是面向一個產品等級結構的,可以擴展不同的產品系列,而簡單工廠模式是面向單一產品的,
4.抽象工廠模式要求客戶端代碼使用抽象介面來創建一組相關的產品物件,而簡單工廠模式僅需要一個傳遞一些引數和一個實體化物件,
5.抽象工廠模式的適用范圍比簡單工廠模式更廣,但實作抽象工廠模式的成本也更高,簡單工廠模式較為簡單易懂,易于使用和實作,
總之,抽象工廠模式適用于需求變動較頻繁,需要同時創建多個產品族的場景,而簡單工廠模式適用于創建單一產品,且該產品創建的邏輯不隨需求變動,
綜上所述,抽象工廠模式和簡單工廠都有自己的特點和應用場景,需要根據具體需求選擇合適的工廠模式來實作代碼,
在黑夜里夢想著光,心中覆寫悲傷,在悲傷里忍受孤獨,空守一絲溫暖, 我的淚水是無底深海,對你的愛已無言,相信無盡的力量,那是真愛永在, 我的信仰是無底深海,澎湃著心中火焰,燃燒無盡的力量,那是忠誠永在,轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/555126.html
標籤:設計模式
上一篇:手把手教你實戰TDD
下一篇:返回列表
