GOF設計模式——Factory Method模式
一、什麽是Factory Method模式
Factory Method模式是用來構建生成實例的工廠,在該模式下,父類決定實例生成的方式,但並不決定所要生成的具體類。這樣的設計思想,就跟Template Method模式相似(具體參考:https://www.cnblogs.com/SysoCjs/p/10327088.html或者https://blog.csdn.net/weixin_39400271/article/details/86565016),因為Factory Method模式就是建立在Template Method模式的基礎上,前者是決定實例的生成方式,而後者則是決定方法的執行流程。
二、Factory Method模式思想
Product:一個抽象類,屬於框架的一部分。裏面定義了在Factory Method模式下生成的實現所擁有的接口(API);
Creator:負責生成Product角色的抽象類,也是屬於框架的一部分;
ConcreteProduct:決定了具體的產品;
ConcreteCreator:負責生成具體的產品類。
三、具體例子
假設要設計一個IDCard的工廠類,用來“制造”很多很多的IDCard。
1、Factory類
package com.cjs.factoryMethod;
public abstract class Factory {
public final Product create(String owner) {
Product product = createProduct(owner);
registerProduct(product);
return product;
}
//Factory類只知道下面兩個方法的作用,至於它們是怎麽做的,Factory類不知道,也不關心,具體實現交給相應的子類
protected abstract Product createProduct(String owner);//調用此方法,生成產品(類對象)
protected abstract void registerProduct(Product product);//調用此方法,註冊產品(類對象)
}
Factory抽象類定義了兩個抽象方法:createProduct和registerProduct,分別用於創建產品和註冊產品;另外,還定義了一個final修飾的方法,裏面設定了一些處理流程,這也就是Template Method模式的設計思想。
2、Product類
package com.cjs.factoryMethod;
public abstract class Product {
public abstract void use();
}
3、IDCardFactory類
package com.cjs.factoryMethod;
import java.util.*;
public class IDCardFactory extends Factory {
private List owners = new ArrayList();
@Override
protected Product createProduct(String owner) {
return new IDCard(owner);
}
@Override
protected void registerProduct(Product product) {
owners.add(((IDCard)product).getOwner());
}
}
繼承了Factory抽象類,實現了createProduct方法和registerProduct方法,換句話說,只要繼承了Factory類,就具有“工廠”的制造功能。
4、IDCard類
package com.cjs.factoryMethod;
public class IDCard extends Product {
private String owner;
public IDCard(String owner) {
System.out.println("制作 " + owner + " 的ID卡");
this.owner = owner;
}
@Override
public void use() {
System.out.println("使用 " + owner + " 的ID卡");
}
public String getOwner() {
return owner;
}
}
5、Main類
package com.cjs.factoryMethod;
public class Main {
public static void main(String[] args) {
Factory factory = new IDCardFactory();
IDCard idCard1 = (IDCard) factory.create("張三");
IDCard idCard2 = (IDCard) factory.create("李四");
IDCard idCard3 = (IDCard) factory.create("王五");
idCard1.use();
idCard2.use();
idCard3.use();
}
}
輸出信息:
四、Factory Method模式的優點
如果現在有一個新需求,要給每一個人制做一個工牌,那麽,只要編寫一個EmployeeCardFactory類,繼承Factory類,並實現兩個抽象方法,那麽EmployeeCardFactory類就具有“工廠”的功能。請註意,這裏並沒有修改任何關於模板框架的內容,就可以創建出其他的“工廠”和“產品”。
GOF設計模式——Factory Method模式