設計模式(二): 工廠方法模式

一、介紹

工廠方法模式應該是工廠模式家族中用的最多的模式,一般項目中存在的最多的就是這個模式。
工廠方法模式是簡單工廠的進一步深化,在工廠方法模式中,我們不再提供一個統一的工廠類來創建所有的對象,而是針對不同的對象提供不同的工廠。也就是說每個對對象都有一個與之對應的工廠。

二、適用場景

  • 一個類不知道它所需要的對象的類:在工廠方法模式中,客戶端不需要知道具體產品類的類型,只需要知道所對應的的工廠即可,具體的產品對象由具體工廠類創建,客戶端需要知道創建具體產品的工廠類。
  • 一個類通過其子類來指定創建哪個對象:在工廠方法模式中,對於抽象工廠類只需要提供一個創建產品的接口,而由其子類來確定具體要創建的對象,利用面向對象的多態性和里氏。
  • 將創建對象的任務委託給多個工廠子類中的某一個,客戶端在使用時可以無需關心哪一個子類創建產品子類,需要時再動態指定,可將具體工廠類的類名存儲在配置文件或數據庫中。

三、工廠方法模式角色分配

  1. 抽象工廠(Abstract Factory)角色:是工廠方法模式的核心,與應用程序無關。任何在模式中創建的對象的工廠類必須實現這個接口。
  2. 具體工廠(Concrete Factory)角色:這是實現抽象工廠接口的具體工廠類,包含與應用程序密切相關的邏輯,並且受到應用程序調用以創建某一種產品對象。
  3. 抽象產品(Abstract Product)角色:工廠方法模式所創建對象的超類型,也就是產品對象的共同父類或者共同擁有的接口。
  4. 具體產品(Concrete Product)角色:這個角色實現了抽象產品角色所定義的接口。某具體產品有專門的具體工廠創建,他們之間往往一一對應。

四、工廠方法模式實例

創建一個可以繪製不同形狀的繪圖工具,可以繪製圓形,正方形,三角形,每個圖形都會有一個draw()方法用於繪圖.
(1)創建 Shape 接口

public inteface Shape(){
	void draw();
}

(2)創建實現該接口的具體圖形類

圓形

public class Circle implements Shape {
    public Circle() {
        System.out.println("Circle");
    }
    @Override
    public void draw() {
        System.out.println("Draw Circle");
    }
}

長方形

public class Rectangle implements Shape {
    public Rectangle() {
        System.out.println("Rectangle");
    }
    @Override
    public void draw() {
        System.out.println("Draw Rectangle");
    }
}

正方形

public class Square implements Shape {
    public Square() {
        System.out.println("Square");
    }

    @Override
    public void draw() {
        System.out.println("Draw Square");
    }
}

(3)工廠接口

public interface Factory(){
	public Shape getShape();
}

(4)相關工廠類
圓形工廠類

public class CircleFactory implements Factory {
    @Override
    public Shape getShape() {
        return new Circle();
    }
}

長方形工廠類

public class RectangleFactory implements Factory{
    @Override
    public Shape getShape() {
        return new Rectangle();
    }
}

正方形工廠類

public class SquareFactory implements Factory{
    @Override
    public Shape getShape() {
        return new Square();
    }
}

(5)測試:

public class Test {
    public static void main(String[] args) {
        Factory circlefactory = new CircleFactory();
        Shape circle = circlefactory.getShape();
        circle.draw();
    }
}

輸出結果:

Circle
Draw Circle
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章