簡(jiǎn)單工廠模式(Factory Method)

定義

定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類,使得一個(gè)類的實(shí)例化可以延遲到子類實(shí)現(xiàn)。

本質(zhì)

選擇實(shí)現(xiàn)。

簡(jiǎn)單工廠的重點(diǎn)在于選擇,實(shí)現(xiàn)是已經(jīng)做好了的,目的在于為客戶端來(lái)選擇相應(yīng)的實(shí)現(xiàn),從而使得客戶端和實(shí)現(xiàn)之間解耦,這樣一來(lái),實(shí)現(xiàn)發(fā)生了變化,就不用變更客戶端了。

登場(chǎng)角色

  • Product(產(chǎn)品)

    產(chǎn)品抽象類,定義了產(chǎn)品特性,即客戶所需要的功能接口。

  • Creator(創(chuàng)建者)

    工廠抽象類,定義產(chǎn)品的生成流程,

  • ConcreteProduct(具體的產(chǎn)品)

    決定具體的產(chǎn)品,因?yàn)樗鼘?shí)現(xiàn)了產(chǎn)品的特性,可能會(huì)有多個(gè)。

  • ConcreteCreator(具體的創(chuàng)建者)

    負(fù)責(zé)生成具體的產(chǎn)品,因?yàn)樗鼘?shí)現(xiàn)了產(chǎn)品的生成流程。

示例代碼

/**
 * 產(chǎn)品的抽象類,定義了產(chǎn)品的特性
 */
public abstract class Product {
    public abstract void use();
}


/**
 * 生成產(chǎn)品的抽象類,定義了生成產(chǎn)品的步驟
 */
public abstract class Factory {
    public final Product create(String owner){
        Product product = createProduct(owner);
        resisterProduct(product);
        return product;
    }
    protected abstract Product createProduct(String owner);
    protected abstract void resisterProduct(Product product);
}


/**
 * 具體的產(chǎn)品實(shí)現(xiàn)類
 */
public class IDCard extends Product{
    private String owner;
    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;
    }
}


/**
 * 生成產(chǎn)品的工廠,實(shí)現(xiàn)了產(chǎn)品的生產(chǎn)過(guò)程
 */
public class IDCardFactory extends Factory{
    private List<String> owners = new ArrayList();
    @Override
    protected Product createProduct(String owner) {
        return new IDCard(owner);
    }

    public List<String> getOwners() {
        return owners;
    }

    @Override
    protected void resisterProduct(Product product) {
        owners.add(((IDCard)product).getOwner());
    }
}


/**
 * 測(cè)試
 */
public class RunFactory {
    public static void main(String args[]){
        Factory factory = new IDCardFactory();
        Product idCard1 = factory.create("小明1");
        Product idCard2 = factory.create("小明2");
        Product idCard3 = factory.create("小明3");

        idCard1.use();
        idCard2.use();
        idCard3.use();
    }
}

運(yùn)行結(jié)果

制作小明1的ID卡
制作小明2的ID卡
制作小明3的ID卡
使用了小明1的ID卡
使用了小明2的ID卡
使用了小明3的ID卡

功能

用來(lái)創(chuàng)建一個(gè)具體的類實(shí)例。

優(yōu)點(diǎn)

  • 封裝,封裝了對(duì)象的實(shí)現(xiàn)過(guò)程,使外部的調(diào)用能夠面向接口編程。
  • 解耦,因?yàn)榉庋b了對(duì)象的實(shí)現(xiàn)過(guò)程,使得外部?jī)H通過(guò)接口調(diào)用就可以得到對(duì)象的引用, 從而實(shí)現(xiàn)了對(duì)象的創(chuàng)建和使用的解耦。

缺點(diǎn)

  • 增加了外部獲取對(duì)象的復(fù)雜度,因?yàn)閯?chuàng)建對(duì)象所需要的參數(shù),需要外部提供,這樣就需要外部能夠理解每一個(gè)參數(shù)的含義,增加了使用的難度。

何時(shí)使用

  • 想要完全封裝隔離具體實(shí)現(xiàn),讓外部只能通過(guò)接口取得對(duì)象,那么可以選用簡(jiǎn)單工廠模式,讓客戶端通過(guò)工廠提供的接口來(lái)取得對(duì)象,而不用關(guān)心對(duì)象的具體實(shí)現(xiàn)。
  • 如果想把對(duì)外創(chuàng)建對(duì)象的職責(zé)集中管理和控制,可以選用簡(jiǎn)單工廠,一個(gè)簡(jiǎn)單工廠模式可以創(chuàng)建很多、不相關(guān)的對(duì)象。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容