工廠模式(Factory Pattern)

一、工廠模式簡介

1. 定義

工廠模式(Factory Pattern)是Java中常用的設(shè)計模式之一,這種設(shè)計模式屬于創(chuàng)建型模式。工廠模式的主要意圖是為創(chuàng)建對象提供過渡接口,以便將創(chuàng)建對象的具體過程屏蔽隔離起來,達到提高靈活性的目的。

2. 分類

工廠模式可以分為三類:

  • 簡單工廠模式(Simple Factory)
  • 工廠方法模式(Factory Method)
  • 抽象工廠模式(Abstract Factory)

二、簡單工廠模式

1. 定義

簡單工廠模式又稱靜態(tài)工廠方法模式,其工廠類定義了一個靜態(tài)方法。在簡單工廠模式中,工廠類處于對產(chǎn)品類實例化調(diào)用的中心位置上,它決定那一個產(chǎn)品類應(yīng)當(dāng)被實例化。簡而言之,就是有一個專門生產(chǎn)某個產(chǎn)品的類。

2. 模式組成

  • 抽象產(chǎn)品
  • 具體產(chǎn)品
  • 工廠類

3. 具體實現(xiàn)

鼠標(biāo)工廠,專業(yè)生產(chǎn)鼠標(biāo),給參數(shù)"Dell",生產(chǎn)戴爾鼠標(biāo),給參數(shù)Hp",生產(chǎn)惠普鼠標(biāo)。

/**
 * 抽象產(chǎn)品-鼠標(biāo)
 */
public abstract class Mouse {
    public abstract void sayHi();
}
/**
 * 具體產(chǎn)品-戴爾鼠標(biāo)
 */
public class DellMouse extends Mouse {
    @Override
    public void sayHi() {
        System.out.println("**** SimpleFactoryPattern ****    I am a Dell Mouse.");
    }
}
/**
 * 具體產(chǎn)品-惠普鼠標(biāo)
 */
public class HpMouse extends Mouse {
    @Override
    public void sayHi() {
        System.out.println("**** SimpleFactoryPattern ****    I am a Hp Mouse.");
    }
}
/**
 * 工廠類
 */
public class MouseFactory {

    public static Mouse ManufactureMouse(String mouseType) {
        if ("Dell".equals(mouseType)) {
            return new DellMouse();
        } else if ("Hp".equals(mouseType)) {
            return new HpMouse();
        }
        return null;
    }
}

外界通過調(diào)用工廠類的靜態(tài)方法,傳入不同參數(shù)從而創(chuàng)建不同具體產(chǎn)品類的實例:

private void testSimpleFactoryPattern() {
        Mouse dellMouse = MouseFactory.ManufactureMouse("Dell");
        if (dellMouse != null) {
            dellMouse.sayHi();
        }

        Mouse hpMouse = MouseFactory.ManufactureMouse("Hp");
        if (hpMouse != null) {
            hpMouse.sayHi();
        }
    }

輸出結(jié)果:

**** SimpleFactoryPattern ****    I am a Dell Mouse.
**** SimpleFactoryPattern ****    I am a Hp Mouse.

三、工廠方法模式

1. 定義

工廠方法模式去掉了簡單工廠模式中工廠類中的靜態(tài)屬性,使得它可以被子類繼承,而子類則負責(zé)生成具體的對象。這樣就可以將類的實例化延遲到工廠類的子類中完成,即由子類來決定應(yīng)該實例化哪一個類。

2. 模式組成

  • 抽象產(chǎn)品
  • 具體產(chǎn)品
  • 抽象工廠
  • 具體工廠

3. 具體實現(xiàn)

生產(chǎn)鼠標(biāo)工廠是個父類,有生產(chǎn)鼠標(biāo)這個接口。生產(chǎn)戴爾鼠標(biāo)工廠,生產(chǎn)惠普鼠標(biāo)工廠分別繼承這個工廠父類,可以分別生產(chǎn)戴爾鼠標(biāo),惠普鼠標(biāo)。生產(chǎn)哪種鼠標(biāo)不再由參數(shù)決定,而是由創(chuàng)建的具體鼠標(biāo)工廠決定,后續(xù)直接調(diào)用鼠標(biāo)工廠.生產(chǎn)鼠標(biāo)()即可。

/**
 * 抽象產(chǎn)品-鼠標(biāo)
 */
public abstract class Mouse {
    public abstract void sayHi();
}
/**
 * 具體產(chǎn)品-戴爾鼠標(biāo)
 */
public class DellMouse extends Mouse {
    @Override
    public void sayHi() {
        System.out.println("**** FactoryPattern ****    I am a Dell Mouse.");
    }
}
/**
 * 具體產(chǎn)品-惠普鼠標(biāo)
 */
public class HpMouse extends Mouse {
    @Override
    public void sayHi() {
        System.out.println("**** FactoryPattern ****    I am a Hp Mouse.");
    }
}
/**
 * 抽象工廠-生產(chǎn)鼠標(biāo)
 */
public abstract class MouseFactory {
    public abstract Mouse ManufactureMouse();
}
/**
 * 具體工廠-生產(chǎn)戴爾鼠標(biāo)
 */
public class DellMouseFactory extends MouseFactory {
    @Override
    public Mouse ManufactureMouse() {
        return new DellMouse();
    }
}
/**
 * 具體工廠-生產(chǎn)惠普鼠標(biāo)
 */
public class HpMouseFactory extends MouseFactory {
    @Override
    public Mouse ManufactureMouse() {
        return new HpMouse();
    }
}

創(chuàng)建不同的鼠標(biāo)工廠,生產(chǎn)不同的鼠標(biāo):

private void testFactoryPattern() {
        MouseFactory dellMouseFactory = new DellMouseFactory();
        dellMouseFactory.ManufactureMouse().sayHi();

        MouseFactory hpMouseFactory = new HpMouseFactory();
        hpMouseFactory.ManufactureMouse().sayHi();
    }

輸出結(jié)果:

**** FactoryPattern ****    I am a Dell Mouse.
**** FactoryPattern ****    I am a Hp Mouse.

四、抽象工廠模式

1. 定義

抽象工廠模式是工廠方法模式的升級版本,用來創(chuàng)建一組相關(guān)或者相互依賴的對象。它允許使用抽象的接口來創(chuàng)建一組相關(guān)產(chǎn)品,而不需要知道或關(guān)心實際生產(chǎn)出的具體產(chǎn)品是什么,具體的工廠負責(zé)會實現(xiàn)具體的產(chǎn)品實例。其與工廠方法模式最大的區(qū)別就是抽象工廠中每個工廠可以創(chuàng)建多種類的產(chǎn)品,而工廠方法每個工廠只能創(chuàng)建一類產(chǎn)品。

2. 模式組成

  • 抽象產(chǎn)品(多個)
  • 具體產(chǎn)品
  • 抽象工廠
  • 具體工廠

3. 具體實現(xiàn)

抽象工廠模式也就是不僅生產(chǎn)鼠標(biāo),而且同時生產(chǎn)鍵盤。PC廠商是個父類,有生產(chǎn)鼠標(biāo),生產(chǎn)鍵盤兩個接口。戴爾工廠,惠普工廠分別繼承這個父類,可以分別生產(chǎn)戴爾鼠標(biāo)和戴爾鍵盤,以及惠普鼠標(biāo)和惠普鍵盤。生產(chǎn)的鼠標(biāo)以及鍵盤由創(chuàng)建的工廠決定,后續(xù)工廠.生產(chǎn)鼠標(biāo)()則生產(chǎn)具體的鼠標(biāo),工廠.生產(chǎn)鍵盤()則生產(chǎn)具體的鍵盤。

/**
 * 抽象產(chǎn)品-鼠標(biāo)
 */
public abstract class Mouse {
    public abstract void sayHi();
}
/**
 * 抽象產(chǎn)品-鍵盤
 */
public abstract class Keyboard {
    public abstract void sayHi();
}
/**
 * 具體產(chǎn)品-戴爾鼠標(biāo)
 */
public class DellMouse extends Mouse {
    @Override
    public void sayHi() {
        System.out.println("**** AbstractFactoryPattern ****    I am a Dell Mouse.");
    }
}
/**
 * 具體產(chǎn)品-惠普鼠標(biāo)
 */
public class HpMouse extends Mouse {
    @Override
    public void sayHi() {
        System.out.println("**** AbstractFactoryPattern ****    I am a Hp Mouse.");
    }
}
/**
 * 具體產(chǎn)品-戴爾鍵盤
 */
public class DellKeyboard extends Keyboard {
    @Override
    public void sayHi() {
        System.out.println("**** AbstractFactoryPattern ****    I am a Dell Keyboard.");
    }
}
/**
 * 具體產(chǎn)品-惠普鍵盤
 */
public class HpKeyboard extends Keyboard {
    @Override
    public void sayHi() {
        System.out.println("**** AbstractFactoryPattern ****    I am a Hp Keyboard.");
    }
}
/**
 * 抽象工廠-生產(chǎn)鼠標(biāo)和鍵盤
 */
public abstract class PcFactory {
    public abstract Mouse ManufactureMouse();
    public abstract Keyboard ManufactureKeyboard();
}
/**
 * 具體工廠-生產(chǎn)戴爾鼠標(biāo)和戴爾鍵盤
 */
public class DellFactory extends PcFactory {
    @Override
    public Mouse ManufactureMouse() {
        return new DellMouse();
    }

    @Override
    public Keyboard ManufactureKeyboard() {
        return new DellKeyboard();
    }
}
/**
 * 具體工廠-生產(chǎn)惠普鼠標(biāo)和惠普鍵盤
 */
public class HpFactory extends PcFactory {
    @Override
    public Mouse ManufactureMouse() {
        return new HpMouse();
    }

    @Override
    public Keyboard ManufactureKeyboard() {
        return new HpKeyboard();
    }
}

創(chuàng)建不同的工廠,生產(chǎn)不同的鼠標(biāo)和鍵盤:

private void testAbstractFactoryPattern() {
        PcFactory dellFactory = new DellFactory();
        dellFactory.ManufactureMouse().sayHi();
        dellFactory.ManufactureKeyboard().sayHi();

        PcFactory hpFactory = new HpFactory();
        hpFactory.ManufactureMouse().sayHi();
        hpFactory.ManufactureKeyboard().sayHi();
    }

輸出結(jié)果:

**** AbstractFactoryPattern ****    I am a Dell Mouse.
**** AbstractFactoryPattern ****    I am a Dell Keyboard.
**** AbstractFactoryPattern ****    I am a Hp Mouse.
**** AbstractFactoryPattern ****    I am a Hp Keyboard.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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