Java-設計模式-第四篇-工廠模式

本人所學設計模式皆出自於 結城浩先生的《圖解設計模式》。

類圖

爲什麼使用工廠模式

        在工廠模式中,父類決定實例生成的方式,但不決定所要生成的具體類,具體的處理全部交給子類。這樣就可以將生成實例的框架和實際負責生成實例的類解耦。

示例代碼

        
package com.qiang.framework;

/**
 * 抽象工廠
 *
 * @author zhangxinqiang
 * @date 01/04/2018
 */
public abstract class Factory {
    /**
     * 模板模式調用 用來常見一個產品,並且加入工廠記錄
     *
     * @param owner 根據自己所需隨意增加參數
     * @return 創建的產品
     */
    public final Product create(String owner) {
        Product product = createProduct(owner);
        registerProduct(product);
        return product;
    }

    /**
     * 創建商品的抽象方法
     *
     * @param owner 根據自己所需隨意增加參數
     * @return 產品
     */
    protected abstract Product createProduct(String owner);

    /**
     * 註冊商品的抽象方法
     *
     * @param product 當前創建的產品
     */
    protected abstract void registerProduct(Product product);
}
package com.qiang.framework;

/**
 * 抽象產品
 *
 * @author zhangxinqiang
 * @date 01/04/2018
 */
public abstract class Product {
    /**
     * 產品應有的共性功能
     */
    public abstract void use();
}
package com.qiang.factory;

import com.qiang.framework.Product;

/**
 * 產品-身份證
 *
 * @author zhangxinqiang
 * @date 01/04/2018
 */
public class IdCard extends Product {
    private String owner;

    public IdCard(String owner) {
        System.out.println("正在生產:" + owner + " 的身份證");
        this.owner = owner;
    }

    @Override
    public void use() {
        System.out.println(owner + "的身份證正在被使用");
    }

    public String getOwner() {
        return owner;
    }
}
package com.qiang.factory;

import com.qiang.framework.Factory;
import com.qiang.framework.Product;

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

/**
 * 用來生產身份證的工廠
 *
 * @author zhangxinqiang
 * @date 01/04/2018
 */
public class IdCardFactory extends Factory {
    private List<IdCard> owner = new ArrayList<>();

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

    @Override
    protected void registerProduct(Product product) {
        owner.add((IdCard) product);
    }
}
package com.qiang;

import com.qiang.factory.IdCardFactory;
import com.qiang.framework.Factory;
import com.qiang.framework.Product;

/**
 * 測試類
 *
 * @author zhangxinqiang
 * @date 01/04/2018
 */
public class Test {
    public static void main(String[] args) {
        Factory idCardFactory = new IdCardFactory();
        Product product = idCardFactory.create("張三");
        product.use();
        Product lisi = idCardFactory.create("李四");
        lisi.use();
    }
}

結果

正在生產:張三 的身份證
張三的身份證正在被使用
正在生產:李四 的身份證
李四的身份證正在被使用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章