文章目錄
- 1. 為什麼要用工廠模式?
- 2. 解決的問題?
- 3.在什麼地方用工廠模式?
- 4. 它的組成部分?UML類圖?
- 5. 代碼demo
- 6. 注意的點
- 7. 優缺點
1. 為什麼要用工廠模式?
- 對于容易變化的地方,應該考慮用一個單獨的類做創造的過程,這就是工廠。
-
工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。
這種類型的設計模式屬于建立型模式,它提供了一種建立對象的最佳方式。
在工廠模式中,我們在建立對象時不會對用戶端暴露建立邏輯,并且是通過使用一個共同的接口來指向新建立的對象。
- 定義一個建立對象的接口,讓其子類自己決定執行個體化哪一個工廠類,工廠模式使其建立過程延遲到子類進行。
2. 解決的問題?
- 主要解決接口選擇問題,利用同一個接口,其子類實作接口進而滿足不同的類。
- 例如,我們想要一輛汽車,我們直接就從工廠提貨就行了,不用去管這輛汽車怎麼做的和内部實作。
- 内部實作其實就是子類實作接口的具體内容。
3.在什麼地方用工廠模式?
- 建立對象。并且是建立多種不同的對象等,對建立這個操作有不同或頻繁修改的需求的情況,可以考慮使用。
- 使用工廠模式,可以調用工廠接口來滿足不同的需求,而這個需求具體的實作是由子類實作接口來完成的,是以建立對象的邏輯是不會對用戶端暴露的。
-
還有一些具體場景
1、日志記錄器:記錄可能記錄到本地硬碟、系統事件、遠端伺服器等,使用者可以選擇記錄日志到什麼地方。
2、資料庫通路,當使用者不知道最後系統采用哪一類資料庫,以及資料庫可能有變化時。
3、設計一個連接配接伺服器的架構,需要三個議,“POP3”、“IMAP”、“HTTP”,可以把這三個作為産品類,共同實作一個接口。
4. 它的組成部分?UML類圖?
- 1.Shape接口;
- 2.Shape接口的實體類;
- 3.ShapeFactory工廠類;
-
互相之間的邏輯
用戶端隻會調用ShapeFactory來進行執行個體建立。
ShapeFactory根據用戶端的需求判斷調用哪種實體類進行執行個體化。
實體類實作的是Shape接口,有多少種不同的實體,就需要實作多少種實體類。
5. 代碼demo
package design_pattern;
// interface
interface Shape {
void draw();
}
// implement interface
class Circle implements Shape {
@Override
public void draw() {
System.out.println("Draw circle.");
}
}
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Draw rectangle.");
}
}
class Square implements Shape {
@Override
public void draw() {
System.out.println("Draw square.");
}
}
// Shape Factory
class ShapeFactory {
Shape getShape(String shapeType) {
if (shapeType == null) {
System.out.println("Error type!");
return null;
}
Shape shape = null;
switch (shapeType) {
case "Circle":
shape = new Circle();
break;
case "Rectangle":
shape = new Rectangle();
break;
case "Square":
shape = new Square();
break;
default:
System.out.println("default!");
}
return shape;
}
}
public class FactoryPattern {
public static void main(String[] args) {
// 調用工廠建立不同執行個體
ShapeFactory shapeFactory = new ShapeFactory();
Shape shape1 = shapeFactory.getShape("Circle");
shape1.draw();
Shape shape2 = shapeFactory.getShape("Rectangle");
shape2.draw();
Shape shape3 = shapeFactory.getShape("Square");
shape3.draw();
Shape shape4 = shapeFactory.getShape(null);
if (shape4 == null) {
System.out.println("Shape4 is null.");
} else {
shape4.draw();
}
Shape shape5 = shapeFactory.getShape("123");
if (shape5 == null) {
System.out.println("Shape5 is null.");
} else {
shape5.draw();
}
}
}
// 輸出
Draw circle.
Draw rectangle.
Draw square.
Error type!
Shape4 is null.
default!
Shape4 is null.
6. 注意的點
- 作為一種建立類模式,在任何需要生成複雜對象的地方,都可以使用工廠方法模式。
- 有一點需要注意的地方就是複雜對象适合使用工廠模式,而簡單對象,特别是隻需要通過 new 就可以完成建立的對象,無需使用工廠模式。如果使用工廠模式,就需要引入一個工廠類,會增加系統的複雜度。
7. 優缺點
-
優點:
1、一個調用者想建立一個對象,隻要知道其名稱就可以了。
2、擴充性高,如果想增加一個産品,隻要擴充一個工廠類就可以。
3、屏蔽産品的具體實作,調用者隻關心産品的接口。
-
缺點:
每次增加一個産品時,都需要增加一個具體類和對象實作工廠,使得系統中類的個數成倍增加,在一定程度上增加了系統的複雜度,同時也增加了系統具體類的依賴。這并不是什麼好事。