設計模式 —— 工廠模式

鐵鏽的秀發表於2019-02-21

簡介

工廠模式(Factory Pattern)專門負責將大量有共同介面的類例項化。工廠模式可以動態決定將哪一個類例項化,不必事先知道每次要例項化哪一個類。

簡單工廠模式

簡單工廠模式(Simple Factory Pattern):又稱為靜態工廠方法(Static Factory Method)模式,它屬於類建立型模式。在簡單工廠模式中,可以根據引數的不同返回不同類的例項。簡單工廠模式專門定義一個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。簡單工廠並不屬於23種設計模式。

例項

肥宅喜愛的各種快樂水(意指本人) 快樂水(產品介面)

public interface Kls {

    String name();

}
複製程式碼

肥宅快樂水-可樂(具體產品)

public class Coke implements Kls {
    @Override
    public String name() {
        return "肥宅快樂水-可樂";
    }
}
複製程式碼

快樂水-雪碧(具體產品)

public class Sprite implements Kls {
    @Override
    public String name() {
        return "快樂水-雪碧";
    }
}
複製程式碼

快樂水工廠(工廠類)

public class KlsFactory {

    public static Kls getFzs(String type) throws Exception {
        Kls fzs = null;
        if ("coke".equalsIgnoreCase(type)) {
            fzs = new Coke();
        } else if ("sprite".equalsIgnoreCase(type)) {
            fzs = new Sprite();
        }
        if (Objects.isNull(fzs)) {
            throw new RuntimeException("沒找到快樂水~");
        }
        return fzs;
    }
}
複製程式碼

肥宅(客戶)

public class Fz {
    @Test
    public void drink() throws Exception {
        // 製造可樂
        Kls coke = KlsFactory.getFzs("coke");
        System.out.println("肥宅開始喝:" + coke.name());

        // 製造雪碧
        Kls sprite = KlsFactory.getFzs("sprite");
        System.out.println("肥宅開始喝:" + sprite.name());
    }
}
複製程式碼

UML類圖

簡單工廠

優點:

  1. 隱藏了具體實現:像 CokeSprite,這樣的產品,客戶端是不需要知道具體實現的,只需知道怎麼用;

  2. 客戶端只需直接使用物件就好,不需關心物件是怎麼 new 出來的;

  3. 接耦:客戶端沒有 new xxx 這樣的硬編碼,後期設計者改變框架,各種類(除了工廠類)都有改變,只要工廠類的名字、方法名字沒變,客戶端的程式碼,一行都不要動。

缺點:

  1. 擴充套件麻煩,需要改動現有程式碼。如果想要增加一個新的產品類,就需要改動工廠類程式碼。
  2. 所有邏輯全放在工廠類,產品一多將變得異常難閱讀,一旦出錯,就全GG了。

工廠方法模式

工廠方法模式(Factory Method)是簡單工廠的僅一步深化, 在工廠方法模式中,我們不再提供一個統一的工廠類來建立所有的物件,而是針對不同的物件提供不同的工廠。也就是說每個物件都有一個與之對應的工廠。

例項

接著上面快樂水的例子。將 快樂水工廠 (KlsFactory 抽象出共有方法,再分別實現具體的快樂水生產工廠。

快樂水總工廠

public interface Factory {
    /**
     * 製造快樂水
     *
     * @return Kls
     */
    Kls create();
}
複製程式碼

可樂工廠

public class CokeFactory implements Factory {
    @Override
    public Kls create() {
        return new Coke();
    }
}
複製程式碼

雪碧工廠

public class SpriteFactory implements Factory {
    @Override
    public Kls create() {
        return new Sprite();
    }
}
複製程式碼

肥宅

public class Fz {
    @Test
    public void drink() throws Exception {
        // 製造可樂
        CokeFactory cokeFactory = new CokeFactory();
        Kls coke = cokeFactory.create();
        System.out.println("肥宅開始喝:" + coke.name());

        // 製造雪碧
        SpriteFactory spriteFactory = new SpriteFactory();
        Kls sprite = spriteFactory.create();
        System.out.println("肥宅開始喝:" + sprite.name());
    }
}
複製程式碼

擴充套件芬達快樂水 芬達快樂水

public class Fanta implements Kls {
    @Override
    public String name() {
        return "快樂水-芬達";
    }
}
複製程式碼

芬達工廠

public class FantaFactory implements Factory {
    @Override
    public Kls create() {
        return new Fanta();
    }
}
複製程式碼

肥宅新增

FantaFactory fantaFactory = new FantaFactory();
Kls fanta = fantaFactory.create();
System.out.println("肥宅開始喝:" + fanta.name());
複製程式碼

UML類圖

工廠方法

優點:

  1. 簡單工廠模式 的有點全部保留;
  2. 新增產品,不需要改動現有的程式碼,只需實現對應的 產品類工廠實現類

缺點:

  1. 增加系統負擔;

  2. 當新增產品較多時,會導致程式碼量劇增;

  3. 一個工廠只能生產一個產品。

相關文章