Javaの設(shè)計模式之工廠模式

推薦閱讀:《設(shè)計模式之禪》

Demo github地址:【FactoryPattern】

FactoryPattern

設(shè)計模式之工廠模式

定義一個用于創(chuàng)建對象的接口,讓子類決定實(shí)例化哪一個類。工廠方法使一個類的實(shí)例化延遲到他的子類。

A、工廠模式的優(yōu)點(diǎn)

  • 良好的封裝性
  • 擴(kuò)展性好
  • 可以屏蔽產(chǎn)品類
  • 工廠模式是典型的解耦框架

B、使用場景

  • new對象的替代品
  • 構(gòu)建靈活的、可擴(kuò)展的框架
  • 可應(yīng)用于異構(gòu)項(xiàng)目
  • 可使用在測試驅(qū)動開發(fā)的框架下

C、模式組成:

  • 1、抽象產(chǎn)品類:AbstractTeaProduct
  • 2、具體產(chǎn)品類:QimenBlackTea、DianBlackTeaRouguiWulongTea
  • 3、抽象工廠類:AbstractTeaFactory
  • 4、具體工廠類:ConcreteTeaFactory

本Demo以茶為產(chǎn)品,制茶廠為產(chǎn)品生產(chǎn)者。

一、抽象產(chǎn)品類

public abstract class AbstractTeaProduct   {

    /**
     * 茶湯顏色
     */
    public abstract void teaColor();

    /**
     * 干茶外形
     */
    public abstract void dryTeaShape();

    /**
     * 茶香
     */
    public abstract void teaFlavor();
}

二、具體產(chǎn)品類

  • QimenBlackTea
public class QimenBlackTea extends AbstractTeaProduct {

    @Override
    public void teaColor() {
        System.out.println("祁門紅茶 - 湯色紅艷明亮");
    }

    @Override
    public void teaFlavor() {
        System.out.println("祁門紅茶 - 【花香】蘊(yùn)含著玫瑰花香,香氣馥郁持久;滋味甘甜醇厚");
    }

    @Override
    public void dryTeaShape() {
        System.out.println("祁門紅茶 - 條索緊細(xì)勻整,鋒苗秀麗,色澤烏潤");
    }
}

  • DianBlackTea
public class DianBlackTea extends AbstractTeaProduct {


    @Override
    public void teaColor() {
        System.out.println("滇紅 - 湯色紅濃透明,金圈顯露");
    }

    @Override
    public void teaFlavor() {
        System.out.println("滇紅 - 【花果香】香氣高純持久;滋味濃厚鮮爽");
    }

    @Override
    public void dryTeaShape() {
        System.out.println("滇紅 - 條索緊直肥壯,苗鋒秀麗完整,金毫多而顯露,色澤油潤");
    }
}

三、抽象工廠類

泛型,實(shí)現(xiàn)了AbstractTeaProduct抽象類的類都可以作為參數(shù)傳入。

public abstract class AbstractTeaFactory   {
    public abstract <T extends AbstractTeaProduct>T makeTea(Class<T> tea);
}

四、具體工廠類

public class ConcreteTeaFactory extends AbstractTeaFactory {

    @Override
    public <T extends AbstractTeaProduct> T makeTea(Class<T> concreteTea) {
        AbstractTeaProduct tea = null;
        try{
            tea = (AbstractTeaProduct) Class.forName(concreteTea.getName()).newInstance();
        }catch (Exception e){
            // 異常處理
        }
        return (T)tea;
    }
}

五、場景類

public class LisaTheCat {
public static void main(String[] args){

        AbstractTeaFactory creator = new ConcreteTeaFactory();
        // 祁門紅茶
        AbstractTeaProduct qimenBlackTea = creator.makeTea(QimenBlackTea.class);
        qimenBlackTea.dryTeaShape();
        qimenBlackTea.teaColor();
        qimenBlackTea.teaFlavor();
        System.out.println("---------------");
        // 滇紅
        AbstractTeaProduct dianBlackTea = creator.makeTea(DianBlackTea.class);
        dianBlackTea.dryTeaShape();
        dianBlackTea.teaColor();
        dianBlackTea.teaFlavor();
        System.out.println("---------------");
        // 肉桂
        AbstractTeaProduct rouguiWulongTea = creator.makeTea(RouguiWulongTea.class);
        rouguiWulongTea.dryTeaShape();
        rouguiWulongTea.teaColor();
        rouguiWulongTea.teaFlavor();
    }
 }

D、簡單工廠模式

簡化去除AbstractHumanFactory,將makeTea方法定義為靜態(tài)方法。

public class SimpleTeaFactory{
    public static <T extends AbstractTeaProduct> T makeTea(Class<T> concreteTea) {
        AbstractTeaProduct tea = null;
        try{
            tea = (AbstractTeaProduct) Class.forName(concreteTea.getName()).newInstance();
        }catch (Exception e){
            // 異常處理
        }
        return (T)tea;
    }
}

E、用工廠模式替代單例模式
單例模式的核心:

在內(nèi)存中只有一個對象

  • 需要單例的類:
public  class Singleton   {
    private Singleton(){}
    public void method(){}
}

  • 創(chuàng)建單例的工廠類:
    【利用反射的方式,為原本無法創(chuàng)建對象的單例類創(chuàng)建一個單例對象】:
public class SingletonFactory  {
    private static Singleton singleton;
    static {
        try {
            Class myClass = Class.forName(Singleton.class.getName());
            Constructor constructor = myClass.getDeclaredConstructor();
            constructor.setAccessible(true);
            singleton = (Singleton) constructor.newInstance();
        }catch (Exception e){
            System.out.println("some exception");
        }
    }
    public static  Singleton getSingleton(){
        return singleton;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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