一、介紹
工廠方法模式應該是工廠模式家族中用的最多的模式,一般項目中存在的最多的就是這個模式。
工廠方法模式是簡單工廠的進一步深化,在工廠方法模式中,我們不再提供一個統一的工廠類來創建所有的對象,而是針對不同的對象提供不同的工廠。也就是說每個對對象都有一個與之對應的工廠。
二、適用場景
- 一個類不知道它所需要的對象的類:在工廠方法模式中,客戶端不需要知道具體產品類的類型,只需要知道所對應的的工廠即可,具體的產品對象由具體工廠類創建,客戶端需要知道創建具體產品的工廠類。
- 一個類通過其子類來指定創建哪個對象:在工廠方法模式中,對於抽象工廠類只需要提供一個創建產品的接口,而由其子類來確定具體要創建的對象,利用面向對象的多態性和里氏。
- 將創建對象的任務委託給多個工廠子類中的某一個,客戶端在使用時可以無需關心哪一個子類創建產品子類,需要時再動態指定,可將具體工廠類的類名存儲在配置文件或數據庫中。
三、工廠方法模式角色分配
- 抽象工廠(Abstract Factory)角色:是工廠方法模式的核心,與應用程序無關。任何在模式中創建的對象的工廠類必須實現這個接口。
- 具體工廠(Concrete Factory)角色:這是實現抽象工廠接口的具體工廠類,包含與應用程序密切相關的邏輯,並且受到應用程序調用以創建某一種產品對象。
- 抽象產品(Abstract Product)角色:工廠方法模式所創建對象的超類型,也就是產品對象的共同父類或者共同擁有的接口。
- 具體產品(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