工廠方法(Factory Method)設計模式

1. 概述

Template Method設計模式來構建生成實例的工廠就是工廠方法(Factory Method)設計模式。

在工廠方法(Factory Method)設計模式,父類決定實例的生成方式,但不決定要生成的具體的類,具體的處理全部交給子類負責,這樣就可以將生成實例的框架(framework)和負責生成實例的類解耦。

2. 代碼實現

首先要創建兩個包,一個framework包,framework包中有工廠類、物品類,這兩個類組成了生成實例的框架。

一個具體包,裏面一個具體物品工廠類、具體物品類。

這裏用鉛筆來作爲具體物品。

工廠類 Factory.java ,create() 方法生成實例,具體的處理由createProduct(String owner)、registerProduct(Product product)這兩個方法,這兩個方法由子類負責:

package factoryMethod.framework;

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

物品類,Product.java :

package factoryMethod.framework;

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

具體物品工廠類PencilFactory.java,繼承Factory.java:

package factoryMethod.pencil;

import factoryMethod.framework.Factory;
import factoryMethod.framework.Product;

import java.util.ArrayList;
import java.util.List;

public class PencilFactory extends Factory {
    private List owners = new ArrayList();

    @Override
    protected Pencil createProduct(String owner) {
        return new Pencil(owner);
    }

    @Override
    protected void registerProduct(Product product) {
        owners.add(((Pencil)product).getOwner());
    }
}

具體物品類,Pencil.java:

package factoryMethod.pencil;

import factoryMethod.framework.Product;

public class Pencil extends Product {
    private String owner;
    Pencil(String owner) {
        System.out.println("製作" + owner + "的pencil");
        this.owner = owner;
    }

    @Override
    public void use() {
        System.out.println("使用" + owner + "的pencil");
    }

    public String getOwner() {
        return owner;
    }
}

測試類,test.java :

package factoryMethod;

import factoryMethod.framework.Factory;
import factoryMethod.framework.Product;
import factoryMethod.pencil.PencilFactory;

public class test {
    public static void main(String args[]) {
        Factory factory = new PencilFactory();
        Product p1 = factory.create("aaa");
        Product p2 = factory.create("bbb");
        Product p3 = factory.create("ccc");
        p1.use();
        p2.use();
        p3.use();
    }
}

運行截圖如下所示:

參考文獻:

  • 圖解設計模式 - 結成浩著、楊文軒譯 - 人民郵電出版社
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章