1. 程式人生 > >GOF設計模式——Factory Method模式

GOF設計模式——Factory Method模式

ray pack vpd span html ont 接口 watermark 關心

一、什麽是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模式