1. 程式人生 > >[設計模式] - No.7 Factory Method 模式

[設計模式] - No.7 Factory Method 模式

Factory Method 模式

Factory Method模式和之前的Template Method模式有相似的地方。在Template Method中,我們在父類中使用模板方法用於定義具體的處理流程,如果我們使用這個具體方法來產生子類例項的話,這樣就是Factory Method 模式。我們結合書中的示例程式碼來看(修改了一些)

AbstractFactory.java

public abstract class AbstractFactory {
    protected abstract void registerProduct(AbstractProduct product)
; protected abstract AbstractProduct createProduct(String owner); public final AbstractProduct create(String owner){ AbstractProduct p = createProduct(owner); registerProduct(p); return p; } }

AbstractProduct.java

public abstract class AbstractProduct {
    public
abstract void use(); }

商品類是一個抽象類,他規定了商品類具有的基本方法。工廠類也是一個抽象類,他規定了該工廠能夠具體產生什麼型別的商品。工廠和商品的具體實現在具體類中。

ConcreteFactory.java

public class ConcreteFactory extends AbstractFactory {

    private List<String> owners;
    public ConcreteFactory() {
        this.owners = new ArrayList<>();
    }
@Override protected void registerProduct(AbstractProduct product) { owners.add(((ConcreteProduct)product).getOwner()); } @Override protected AbstractProduct createProduct(String owner) { return new ConcreteProduct(owner); } public List<String> getOwners() { return owners; } }

ConcreteProduct.java

public class ConcreteProduct extends AbstractProduct {
    private String owner;
    ConcreteProduct(String owner){
        this.owner = owner;
        System.out.println("製作"+ this.owner + "的卡");
    }
    @Override
    public void use() {
        System.out.println("使用"+ this.owner + "的卡");
    }

    public String getOwner() {
        return owner;
    }
}

Main.java

public class Main {
    public static void main(String args []){
        AbstractFactory factory = new ConcreteFactory();
        AbstractProduct p1 = factory.create("小明");
        AbstractProduct p2 = factory.create("小紅");
        AbstractProduct p3 = factory.create("小剛");
        p1.use();
        p2.use();
        p3.use();
    }
}

執行結果也很簡單:

製作小明的卡
製作小紅的卡
製作小剛的卡
使用小明的卡
使用小紅的卡
使用小剛的卡

工廠方法中各類之間的關係如下圖:

在這裡插入圖片描述

可以看出,(抽象的)工廠生產抽象的產品,而產品具體的實現以及工廠具體的生產方法在具體工廠中實現。工廠方法最重要的函式就是createProduct,對產品的建立函式。從而,當我們需要一個產品的具體物件的時候,我們不是使用new方法 ,而是使用工廠類返回該物件。