天天看點

工廠模式

工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。這種類型的設計模式屬于建立型模式,它提供了一種建立對象的最佳方式。

在工廠模式中,我們在建立對象時不會對用戶端暴露建立邏輯,并且是通過使用一個共同的接口來指向新建立的對象。

介紹

意圖:

定義一個建立對象的接口,讓其子類自己決定執行個體化哪一個工廠類,工廠模式使其建立過程延遲到子類進行。

主要解決:

主要解決接口選擇的問題。

何時使用:

我們明确地計劃不同條件下建立不同執行個體時。

如何解決:

讓其子類實作工廠接口,傳回的也是一個抽象的産品。

關鍵代碼:

建立過程在其子類執行。

應用執行個體:

1、您需要一輛汽車,可以直接從工廠裡面提貨,而不用去管這輛汽車是怎麼做出來的,以及這個汽車裡面的具體實作。

2、Hibernate 換資料庫隻需換方言和驅動就可以。

優點:

1、一個調用者想建立一個對象,隻要知道其名稱就可以了。

2、擴充性高,如果想增加一個産品,隻要擴充一個工廠類就可以。

3、屏蔽産品的具體實作,調用者隻關心産品的接口。

缺點:

每次增加一個産品時,都需要增加一個具體類和對象實作工廠,使得系統中類的個數成倍增加,在一定程度上增加了系統的複雜度,同時也增加了系統具體類的依賴。這并不是什麼好事。

使用場景:

1、日志記錄器:記錄可能記錄到本地硬碟、系統事件、遠端伺服器等,使用者可以選擇記錄日志到什麼地方。

2、資料庫通路,當使用者不知道最後系統采用哪一類資料庫,以及資料庫可能有變化時。

3、設計一個連接配接伺服器的架構,需要三個協定,"POP3"、"IMAP"、"HTTP",可以把這三個作為産品類,共同實作一個接口。

注意事項:

作為一種建立類模式,在任何需要生成複雜對象的地方,都可以使用工廠方法模式。有一點需要注意的地方就是複雜對象适合使用工廠模式,而簡單對象,特别是隻需要通過 new 就可以完成建立的對象,無需使用工廠模式。如果使用工廠模式,就需要引入一個工廠類,會增加系統的複雜度。

實作

我們将建立一個 Shape 接口和實作 Shape 接口的實體類。下一步是定義工廠類 ShapeFactory。

FactoryPatternDemo 類使用 ShapeFactory 來擷取 Shape 對象。它将向 ShapeFactory 傳遞資訊(CIRCLE / RECTANGLE / SQUARE),以便擷取它所需對象的類型。

工廠模式

步驟 1

建立一個接口:

Shape.java

public interface Shape {

void draw();

}

步驟 2

建立實作接口的實體類。

Rectangle.java

public class Rectangle implements Shape {

@Override

public void draw() {

System.out.println("Inside Rectangle::draw() method.");

}

Square.java

public class Square implements Shape {

System.out.println("Inside Square::draw() method.");

Circle.java

public class Circle implements Shape {

System.out.println("Inside Circle::draw() method.");

步驟 3

建立一個工廠,生成基于給定資訊的實體類的對象。

ShapeFactory.java

public class ShapeFactory {

//使用 getShape 方法擷取形狀類型的對象

public Shape getShape(String shapeType){

if(shapeType == null){

return null;

}

if(shapeType.equalsIgnoreCase("CIRCLE")){

return new Circle();

} else if(shapeType.equalsIgnoreCase("RECTANGLE")){

return new Rectangle();

} else if(shapeType.equalsIgnoreCase("SQUARE")){

return new Square();

}

return null;

步驟 4

使用該工廠,通過傳遞類型資訊來擷取實體類的對象。

FactoryPatternDemo.java

public class FactoryPatternDemo {

public static void main(String[] args) {

ShapeFactory shapeFactory = new ShapeFactory();

//擷取 Circle 的對象,并調用它的 draw 方法

Shape shape1 = shapeFactory.getShape("CIRCLE");

//調用 Circle 的 draw 方法

shape1.draw();

//擷取 Rectangle 的對象,并調用它的 draw 方法

Shape shape2 = shapeFactory.getShape("RECTANGLE");

//調用 Rectangle 的 draw 方法

shape2.draw();

//擷取 Square 的對象,并調用它的 draw 方法

Shape shape3 = shapeFactory.getShape("SQUARE");

//調用 Square 的 draw 方法

shape3.draw();

步驟 5

執行程式,輸出結果:

Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.
      

其他相關文章

  • 設計模式 – 工廠模式