工廠(chǎng)模式三部曲:Simple Factory Pattern簡(jiǎn)單工廠(chǎng)模式

現(xiàn)實(shí)生活中,原始社會(huì)自給自足(沒(méi)有工廠(chǎng))
農(nóng)耕社會(huì)小作坊(簡(jiǎn)單工廠(chǎng),民間酒坊)
工業(yè)革命流水線(xiàn)(工廠(chǎng)方法,自產(chǎn)自銷(xiāo))
現(xiàn)代產(chǎn)業(yè)鏈代工廠(chǎng)(抽象工廠(chǎng),富士康)
工廠(chǎng)模式的定義:
定義一個(gè)創(chuàng)建對(duì)象的工廠(chǎng)接口,將對(duì)象的實(shí)際創(chuàng)建工作扔到具體子工廠(chǎng)類(lèi)中。滿(mǎn)足了創(chuàng)建型模式中所要求的“創(chuàng)建與使用相分離”的特點(diǎn)

簡(jiǎn)單工廠(chǎng)模式定義
簡(jiǎn)單工廠(chǎng)中創(chuàng)建對(duì)象的方法一般為靜態(tài)方法,所以簡(jiǎn)單工廠(chǎng)又叫靜態(tài)工廠(chǎng)方法模式(Static Factory Method Pattern)
通俗的說(shuō),簡(jiǎn)單工廠(chǎng)模式有一個(gè)具體的工廠(chǎng)類(lèi),可以生產(chǎn)不同的產(chǎn)品。
但是該模式每增加一種產(chǎn)品就要增加一個(gè)具體產(chǎn)品類(lèi)和一個(gè)對(duì)應(yīng)的具體工廠(chǎng)類(lèi),違背開(kāi)閉原則。
優(yōu)點(diǎn):

1. 工廠(chǎng)類(lèi)包含必要的邏輯判斷,可以決定在什么時(shí)候創(chuàng)建哪一個(gè)產(chǎn)品的實(shí)例。客戶(hù)端可以免除直接創(chuàng)建產(chǎn)品對(duì)象的職責(zé)。工廠(chǎng)和產(chǎn)品的職責(zé)區(qū)分明確
2. 客戶(hù)端不需要知道創(chuàng)建的產(chǎn)品的類(lèi)名,只需要知道參數(shù)即可
3. 可以引入配置文件,在不修改客戶(hù)端代碼的情況下更換和添加新的具體產(chǎn)品類(lèi)

缺點(diǎn):

1. 簡(jiǎn)單工廠(chǎng)模式的工廠(chǎng)單一,職責(zé)過(guò)重。且代碼會(huì)很臃腫,違背高聚合原則
2. 會(huì)增加系統(tǒng)中工廠(chǎng)類(lèi)的個(gè)數(shù),復(fù)雜度增加
3. 拓展困難,因?yàn)楹?jiǎn)單工廠(chǎng)使用了static工廠(chǎng)方法,無(wú)法形成基于繼承的等級(jí)結(jié)構(gòu)

應(yīng)用場(chǎng)景:
對(duì)于產(chǎn)品種類(lèi)較少的情況使用簡(jiǎn)單工廠(chǎng)模式。
模式結(jié)構(gòu):

1. 簡(jiǎn)單工廠(chǎng)(SimpleFactory):負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有實(shí)例的內(nèi)部邏輯。創(chuàng)建對(duì)象的方法可以被外界直接調(diào)用
2. 抽象產(chǎn)品(Product):簡(jiǎn)單工廠(chǎng)創(chuàng)建的對(duì)象的父類(lèi),負(fù)責(zé)描述所有實(shí)例的共有的公共接口
3. 具體產(chǎn)品(ConcreteProduct):簡(jiǎn)單工廠(chǎng)的創(chuàng)建目標(biāo)

實(shí)現(xiàn):

/**
 * @Author: KenChen
 * @Description: 簡(jiǎn)單工廠(chǎng)模式示例
 * @Date: Create in  2022/5/11 17:52
 */
public class Client {

    public static void main(String[] args) {
        Product product1 = SimpleFactory.makeProduct(Const.PRODUCT_A);
        Product product2 = SimpleFactory.makeProduct(Const.PRODUCT_B);
        product1.show();
        product2.show();
    }

    //    抽象產(chǎn)品
    public interface Product {
        void show();
    }

    //    具體產(chǎn)品類(lèi)
    static class ConcreteProduct1 implements Product {
        @Override
        public void show() {
            System.out.println("具體產(chǎn)品1");
        }
    }

    static class ConcreteProduct2 implements Product {
        @Override
        public void show() {
            System.out.println("具體產(chǎn)品2");
        }
    }

    final class Const{
        static final int PRODUCT_A = 1;
        static final int PRODUCT_B = 2;
    }

//    工廠(chǎng)類(lèi)
    static class SimpleFactory{
        public static Product makeProduct(int kind){
            switch (kind){
                case 1:
                    return new ConcreteProduct1();
                case 2:
                    return new ConcreteProduct2();
                default:
                    break;
            }
            return null;
        }
    }

}
?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

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