設計模式筆記之二(工廠模式)


說道設計模式,最先講到的設計模式必然是工廠系列的設計模式。下面我們就來看下工廠系列設計模式:

簡單工廠模式

簡單工廠模式嚴格來說都不是一種設計模式,只是工廠方法模式的一個簡單實現,但是我們平時運用最多就是這個簡單工廠模式。

簡單工廠模式通常用在固定且不大會改變的類族的創建。舉個簡單的例子,我們現在有個生化實驗室來克隆人,所以我們要有一個人的模具

人是一個父類:

public class Ren {

}

Ren這個父類有兩個子類:男人和女人

public class NanRen extends Ren {

}
public class NvRen extends Ren {

}

所以我們可以有一個人工廠來分別造出男人和女人(具體怎么造請自行想象,我只是一個宅男程序猿,不是H文作者)。 

class RenFactory {
    public Ren createRen(String gender) {
        Ren r = null;
        if (gender == "male") {
            r = new NanRen();
        } else if (gender == "female") {
            r = new NvRen();
        }
        return r;
    }
}

這是我們的實驗室就能很輕松的制造出男人或者女人了

public class Laboratory {
    public static void main(String[] args) {
        RenFactory rf = new RenFactory();
        Ren nan = rf.createRen("male");
        Ren nv = rf.createRen("female");
    }
}

上面就是一個簡單工廠模式的簡單例子。以下是具體全部代碼

View Code
class Ren {

}

class NanRen extends Ren {

}

class NvRen extends Ren {

}

class RenFactory {
    public Ren createRen(String gender) {
        Ren r = null;
        if (gender == "male") {
            r = new NanRen();
        } else if (gender == "female") {
            r = new NvRen();
        }
        return r;
    }
}

public class Laboratory {
    public static void main(String[] args) {
        RenFactory rf = new RenFactory();
        Ren nan = rf.createRen("male");
        Ren nv = rf.createRen("female");
    }
}

 

工廠方法模式

上面說到了簡單工廠方法,下面我們繼續我們的例子來說明工廠方法模式。

現在我們的實驗室不僅僅要男人和女人,我們還兼並了泰國的某個不知名實驗室,我們還生產人妖,所以我們要安裝新的人妖生產線,還需要更新我們的工廠系統。以下是我們的一個更新方案。

class RenYao extends Ren {
    
}
class RenFactory {
    public Ren createRen(String gender) {
        Ren r = null;
        if (gender == "male") {
            r = new NanRen();
        } else if (gender == "female") {
            r = new NvRen();
        } else if (gender == "renyao") {
            r = new RenYao();
        }
        return r;
    }
}

public class Laboratory {
    public static void main(String[] args) {
        RenFactory rf = new RenFactory();
        Ren nan = rf.createRen("male");
        Ren nv = rf.createRen("female");
        Ren ry = rf.createRen("renyao");
}
}

 但是此時我們的資深顧問提出了不同意見,現在我們兼並泰國的實驗室,我們需要一個人妖的生產線可以從泰國實驗室直接拿來用,但是我們的工廠系統卻也要更改,萬一那一部分錯誤,我們以前能制造的男人和女人也會出問題阿。況且聽說上層正在談收購太陽實驗室的事情,那么到時候我們豈不是又得更新我們的工廠系統了! 我們何不再多造幾個工廠來造不同的人,於是我們實驗室又提出了以下的方案:

創建一個工廠的樣板間以便其他工廠有個參照物

interface Factory {
    public abstract Ren createRen(String gender);
}

保留我們以前生產正常人的工廠

class RenFactory implements Factory{
    public Ren createRen(String gender) {
        Ren r = null;
        if (gender == "male") {
            r = new NanRen();
        } else if (gender == "female") {
            r = new NvRen();
        }
        return r;
    }
}

再新建一座可以生產人妖的人妖工廠

class RenYaoFactory implements Factory{
    public Ren createRen(String gender) {
        Ren r = new RenYao(); //人妖是不在乎性別的
        return r;
    }
}

所以當我們實驗室就可以很順利的經行生產了

public class Laboratory {
    public static void main(String[] args) {
        Factory rf = new RenFactory();
        Ren nan = rf.createRen("male");
        Ren nv = rf.createRen("female");
        
        Factory ryf = new RenYaoFactory();
        Ren ry = ryf.createRen(null);
    }
}

並且在一段時候后我們實驗室成功兼並了太陽實驗室,並在太陽當地設置了我們的獸人工廠。

View Code
class Ren {

}

class NanRen extends Ren {

}

class NvRen extends Ren {

}

class RenYao extends Ren {

}

class ShouRen extends Ren {

}

interface Factory {
    public abstract Ren createRen(String gender);
}

class RenFactory implements Factory {
    public Ren createRen(String gender) {
        Ren r = null;
        if (gender == "male") {
            r = new NanRen();
        } else if (gender == "female") {
            r = new NvRen();
        }
        return r;
    }
}

class RenYaoFactory implements Factory {
    public Ren createRen(String gender) {
        Ren r = new RenYao(); // 人妖是不在乎性別的
        return r;
    }
}

class ShouRenFactory implements Factory {
    public Ren createRen(String gender) {
        Ren r = new ShouRen(); // 獸人是雖然是有性別的,但是我們分不清~
        return r;
    }
}

public class Laboratory {
    public static void main(String[] args) {
        Factory rf = new RenFactory();
        Ren nan = rf.createRen("male");
        Ren nv = rf.createRen("female");

        Factory ryf = new RenYaoFactory();
        Ren ry = ryf.createRen(null);

        Factory srf = new ShouRenFactory();
        Ren sr = srf.createRen(null);
    }
}

抽象工廠模式

自從我們成功兼並泰國和太陽兩家實驗室,我們實驗室反而陷入了虧損的泥潭,這只能說這是一個瘋狂的市場,因為我們的客戶不滿足我們出售的各種赤果果的人,竟然還想讓他們穿上衣服。為了我們偉大的市場,我們實驗室只能再次收購了衣服加工廠,並且根據生產人的經驗,我們分別為正常人,人妖,獸人建立了不同的衣服廠。

class YiFu {

}

class NanRenYiFu extends YiFu {

}

class NvRenYiFu extends YiFu {

}

class RenYaoYiFu extends YiFu {

}

class ShouRenYiFu extends YiFu {

}

interface YiFuFactory {
    public abstract YiFu createYiFu(String gender);
}

class RenYiFuFactory implements YiFuFactory {
    public YiFu createYiFu(String gender) {
        YiFu yf = null;
        if (gender == "male") {
            yf = new NanRenYiFu();
        } else if (gender == "female") {
            yf = new NvRenYiFu();
        }
        return yf;
    }
}

class RenYaoYiFuFactory implements YiFuFactory {
    public YiFu createYiFu(String gender) {
        YiFu yf = new RenYaoYiFu();
        return yf;
    }
}

class ShouRenYiFuFactory implements YiFuFactory {
    public YiFu createYiFu(String gender) {
        YiFu yf = new ShouRenYiFu();
        return yf;
    }
}

我們以為有着以前的經驗,加個衣服廠肯定是簡單的事情,但是當我們將我們的產品投放市場的時候,發現常常將人妖穿的衣服給獸人穿上了,獸人的衣服卻給人妖穿上了。我們的特殊愛好客戶完全受不了穿着齊X小短裙的獸人。

public class Laboratory {
    public static void main(String[] args) {
        Factory rf = new RenFactory();
        Ren nan = rf.createRen("male");
        Ren nv = rf.createRen("female");

        //人妖穿上了獸人的露胸皮坎肩
        Factory ryf = new RenYaoFactory();
        Ren ry = ryf.createRen(null);
        YiFuFactory sryff = new ShouRenYiFuFactory();
        YiFu ryyf = sryff.createYiFu(null);

        //獸人穿上了人妖的齊X小短裙
        Factory srf = new ShouRenFactory();
        Ren sr = srf.createRen(null);
        YiFuFactory ryyff = new RenYaoYiFuFactory();
        YiFu sryf = ryyff.createYiFu(null);
        
    }
}

為了解決問題,我們的資深顧問提出了新的建議:我們再新建幾座組裝工廠。

interface ZuZhuangFactory {
    public abstract Factory createFactory();

    public abstract YiFuFactory createYiFuFactory();
}

class RenZuZhuangFactory implements ZuZhuangFactory {

    public Factory createFactory() {
        return new RenFactory();
    }

    public YiFuFactory createYiFuFactory() {
        return new RenYiFuFactory();
    }
}

class RenYaoZuZhuangFactory implements ZuZhuangFactory {

    public Factory createFactory() {
        return new RenYaoFactory();
    }

    public YiFuFactory createYiFuFactory() {
        return new RenYaoYiFuFactory();
    }
}

class ShouRenZuZhuangFactory implements ZuZhuangFactory {

    public Factory createFactory() {
        return new ShouRenFactory();
    }

    public YiFuFactory createYiFuFactory() {
        return new ShouRenYiFuFactory();
    }
}

現在實驗室就能正確的生產人和衣服也套件了

public class Laboratory {
    public static void main(String[] args) {
        ZuZhuangFactory zzf = new RenZuZhuangFactory();
        Factory rf = zzf.createFactory();
        YiFuFactory ryff = zzf.createYiFuFactory();
        Ren nan = rf.createRen("male");
        Ren nv = rf.createRen("female");
        YiFu nanyf = ryff.createYiFu("male");
        YiFu nvyf = ryff.createYiFu("female");

        // 人妖組裝工廠里拿不到獸人的衣服
        ZuZhuangFactory ryzzf = new RenYaoZuZhuangFactory();
        Factory ryf = ryzzf.createFactory();
        YiFuFactory ryyff = ryzzf.createYiFuFactory();
        Ren ry = ryf.createRen(null);
        YiFu ryyf = ryyff.createYiFu(null);

        // 獸人組裝工廠里拿不到人妖的齊X小短裙
        ZuZhuangFactory srzzf = new ShouRenZuZhuangFactory();
        Factory srf = srzzf.createFactory();
        YiFuFactory sryff = srzzf.createYiFuFactory();
        Ren sr = srf.createRen(null);
        YiFu sryf = sryff.createYiFu(null);
    }
}

以下是全部源碼

View Code
class Ren {

}

class NanRen extends Ren {

}

class NvRen extends Ren {

}

class RenYao extends Ren {

}

class ShouRen extends Ren {

}

interface Factory {
    public abstract Ren createRen(String gender);
}

class RenFactory implements Factory {
    public Ren createRen(String gender) {
        Ren r = null;
        if (gender == "male") {
            r = new NanRen();
        } else if (gender == "female") {
            r = new NvRen();
        }
        return r;
    }
}

class RenYaoFactory implements Factory {
    public Ren createRen(String gender) {
        Ren r = new RenYao(); // 人妖是不在乎性別的
        return r;
    }
}

class ShouRenFactory implements Factory {
    public Ren createRen(String gender) {
        Ren r = new ShouRen(); // 獸人是雖然是有性別的,但是我們分不清~
        return r;
    }
}

class YiFu {

}

class NanRenYiFu extends YiFu {

}

class NvRenYiFu extends YiFu {

}

class RenYaoYiFu extends YiFu {

}

class ShouRenYiFu extends YiFu {

}

interface YiFuFactory {
    public abstract YiFu createYiFu(String gender);
}

class RenYiFuFactory implements YiFuFactory {
    public YiFu createYiFu(String gender) {
        YiFu yf = null;
        if (gender == "male") {
            yf = new NanRenYiFu();
        } else if (gender == "female") {
            yf = new NvRenYiFu();
        }
        return yf;
    }
}

class RenYaoYiFuFactory implements YiFuFactory {
    public YiFu createYiFu(String gender) {
        YiFu yf = new RenYaoYiFu();
        return yf;
    }
}

class ShouRenYiFuFactory implements YiFuFactory {
    public YiFu createYiFu(String gender) {
        YiFu yf = new ShouRenYiFu();
        return yf;
    }
}

interface ZuZhuangFactory {
    public abstract Factory createFactory();

    public abstract YiFuFactory createYiFuFactory();
}

class RenZuZhuangFactory implements ZuZhuangFactory {

    public Factory createFactory() {
        return new RenFactory();
    }

    public YiFuFactory createYiFuFactory() {
        return new RenYiFuFactory();
    }
}

class RenYaoZuZhuangFactory implements ZuZhuangFactory {

    public Factory createFactory() {
        return new RenYaoFactory();
    }

    public YiFuFactory createYiFuFactory() {
        return new RenYaoYiFuFactory();
    }
}

class ShouRenZuZhuangFactory implements ZuZhuangFactory {

    public Factory createFactory() {
        return new ShouRenFactory();
    }

    public YiFuFactory createYiFuFactory() {
        return new ShouRenYiFuFactory();
    }
}

public class Laboratory {
    public static void main(String[] args) {
        ZuZhuangFactory zzf = new RenZuZhuangFactory();
        Factory rf = zzf.createFactory();
        YiFuFactory ryff = zzf.createYiFuFactory();
        Ren nan = rf.createRen("male");
        Ren nv = rf.createRen("female");
        YiFu nanyf = ryff.createYiFu("male");
        YiFu nvyf = ryff.createYiFu("female");

        // 人妖組裝工廠里拿不到獸人的衣服
        ZuZhuangFactory ryzzf = new RenYaoZuZhuangFactory();
        Factory ryf = ryzzf.createFactory();
        YiFuFactory ryyff = ryzzf.createYiFuFactory();
        Ren ry = ryf.createRen(null);
        YiFu ryyf = ryyff.createYiFu(null);

        // 獸人組裝工廠里拿不到人妖的齊X小短裙
        ZuZhuangFactory srzzf = new ShouRenZuZhuangFactory();
        Factory srf = srzzf.createFactory();
        YiFuFactory sryff = srzzf.createYiFuFactory();
        Ren sr = srf.createRen(null);
        YiFu sryf = sryff.createYiFu(null);
    }
}

到這一步我們的市場基本就能穩定下來了,也需你也可以給我們的產品附送一頂帽子,試試看吧!

 

總結

簡單工廠模式最簡單,我們只有一個工廠類,根據不同的需求返回不同的產品實例。

工廠方法模式是我們有一系列類似的工廠,客戶可以根據不同的需求構建不同的工廠來生產產品。

抽象工廠模式是工廠方法模式的進一步抽象:我們有一系列類似的工廠,這些工廠的產品是一些工廠族。

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM