深入淺出設計模式(二)——工廠模式

工廠模式

簡單工廠模式

簡單工廠模式(Simple Factory Pattern),又稱爲靜態工廠方法(static Factory Method),它屬於創建型模式。
在簡單工廠模式中,可以根據參數的不同返回不同類的實例。簡單工廠模式專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。
比如有一個電腦商,目前生產聯想電腦,隨着業務擴展,他現在需要生產惠普的電腦,我們就需要一個單獨的類來專門生產電腦,這就用到了簡單工廠模式。
下面以代碼爲例:

接口:

package designpattern.factory.simplefactory.noodles;

public interface INoodles {
    /**
     * 描述每種麪條啥樣的
     */
    public abstract void desc();
}


package designpattern.factory.simplefactory.noodles;

public class LzNoodles implements INoodles {
    @Override
    public void desc() {
        System.out.println("蘭州拉麪,蘭州特色小喫");
    }
}

package designpattern.factory.simplefactory.noodles;

public class PaoNoodles implements INoodles {
    @Override
    public void desc() {
        System.out.println("泡麪,程序員必備");
    }
}

package designpattern.factory.simplefactory.noodles;

public class ReganNoodles implements INoodles {
    @Override
    public void desc() {
        System.out.println("紅油熱乾麪,武漢特色小喫");
    }
}


簡單工廠模式
package designpattern.factory.simplefactory;

import designpattern.factory.simplefactory.noodles.INoodles;
import designpattern.factory.simplefactory.noodles.LzNoodles;
import designpattern.factory.simplefactory.noodles.PaoNoodles;
import designpattern.factory.simplefactory.noodles.ReganNoodles;

/**
 * 簡單工廠模式
 * 一家“簡單面館”(簡單工廠類)
 */
public class SimpleNoodlesFactory {

    public static final int TYPE_LZ = 1;//蘭州拉麪
    public static final int TYPE_PM = 2;//泡麪
    public static final int TYPE_GK = 3;//熱乾麪

    /**
     * 如果生產對象的方法是static的,這種簡單工廠也叫做靜態工廠
     * 如果生產對象的方法不是static的,這種簡單工廠也叫做實例工廠
     * @param type
     * @return
     */
    public static INoodles createNoodles(int type) {
        switch (type) {
            case 1:
                return new LzNoodles();
            case 2:
                return new PaoNoodles();
            case 3:
                return new ReganNoodles();
            default:
                return new LzNoodles();
        }
    }
}

測試


package designpattern.factory.simplefactory;

import designpattern.factory.simplefactory.noodles.INoodles;
import designpattern.factory.simplefactory.noodles.LzNoodles;

public class Test {

    public static void main(String[] args) {
        /**
         *  一開始,窮,想吃麪必須得自己做
         *  想喫拉麪得自己做,new LzNoodles()
         *  想喫泡麪得自己做,new PaoNoodles()
         *  想喫熱乾麪得自己做,new ReganNoodles()
         */
        // 做拉麪喫
        INoodles lzNoodles = new LzNoodles();
        // 做泡麪喫
        // INoodles paoNoodles = new PaoNoodles();
        // 做熱乾麪喫
        // INoodles reganNoodles = new ReganNoodles();

        // 然而,new來new去,改來改去,好心煩......

        /**
         * 忽然,有一天走了狗屎運成了暴發戶
         * 幸福生活從此來臨,吃麪從此變得簡單
         * 給麪館說一聲想喫啥,麪館做好了給自己就好了
         * 自己不必關心麪條怎麼做(怎麼new,如何new)讓麪館操心去吧(麪館幫我們new)!
         * 好省心,有錢就是好,太爽了!
         */
        INoodles iNoodles = SimpleNoodlesFactory.createNoodles(2);  // 和具體的對象脫離關係
        iNoodles.desc();

        /**考慮使用工廠模式
         * 1) 當客戶程序不需要知道要使用對象的創建過程。
         * 2) 客戶程序使用的對象存在變動的可能,或者根本就不知道使用哪一個具體的對象。
         */
    }
}

工廠方法模式

工廠方法模式是比較複雜一點的工廠模式的體現,主要是通過創建工廠類來進行對對象的構建。

package designpattern.factory.factorymethod;


import designpattern.factory.simplefactory.noodles.INoodles;

/**
 * 工廠方法模式
 */
public interface INoodlesFactory {
     INoodles createNoodles();
}
package designpattern.factory.factorymethod;


import designpattern.factory.simplefactory.noodles.INoodles;
import designpattern.factory.simplefactory.noodles.LzNoodles;

public class LzINoodlesFactory implements INoodlesFactory {
    @Override
    public INoodles createNoodles() {
        return new LzNoodles();
    }
}

package designpattern.factory.factorymethod;


import designpattern.factory.simplefactory.noodles.INoodles;
import designpattern.factory.simplefactory.noodles.PaoNoodles;

public class PaoINoodlesFactory implements INoodlesFactory {
    @Override
    public INoodles createNoodles() {
        return new PaoNoodles();
    }
}

package designpattern.factory.factorymethod;


import designpattern.factory.simplefactory.noodles.INoodles;
import designpattern.factory.simplefactory.noodles.ReganNoodles;

public class ReganINoodlesFactory implements INoodlesFactory {
    @Override
    public INoodles createNoodles() {
        return new ReganNoodles();
    }
}

測試類

package designpattern.factory.factorymethod;


import designpattern.factory.simplefactory.noodles.INoodles;

public class Test {
    public static void main(String[] args) {
        INoodlesFactory noodlesFactory = new LzINoodlesFactory();
        INoodles noodles = noodlesFactory.createNoodles();
        noodles.desc();
    }
}

代碼實例:
設計模式demo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章