工廠模式

工廠模式包含三種模式:簡(jiǎn)單工廠模式负乡、工廠方法模式和抽象工廠模式。

簡(jiǎn)單工廠模式

  • 定義
    簡(jiǎn)單工廠模式:由一個(gè)工廠類根據(jù)傳入的參數(shù)果录,動(dòng)態(tài)決定應(yīng)該創(chuàng)建哪一個(gè)產(chǎn)品類(這些產(chǎn)品類繼承自一個(gè)父類或接口)的實(shí)例涛贯。
    要素:工廠(Creator)坝辫、抽象產(chǎn)品(Product)、具體產(chǎn)品(Concrete Product)
    工廠:負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有實(shí)例的內(nèi)部邏輯汹粤。工廠類的創(chuàng)建產(chǎn)品類的方法可以被外界直接調(diào)用命斧,創(chuàng)建所需的產(chǎn)品對(duì)象。
    抽象產(chǎn)品:所創(chuàng)建的所有產(chǎn)品對(duì)象的父類嘱兼,它負(fù)責(zé)描述所有實(shí)例共有的公共接口国葬。
    具體產(chǎn)品:創(chuàng)建目標(biāo)。
  • 類圖
SimpleFactoryPattern.png
  • Class
// 披薩:抽象的產(chǎn)品或抽象的算法
// 此抽象類提供了某些默認(rèn)的基本做法
public abstract class Pizza {
    public static final int CheesePizza = 1;
    public static final int ClamPizza = 2;

    public String name;

    protected void prepare(){
        System.out.println("Preparing " + name);
    }
    protected void bake(){
        System.out.println("Bake for 25 minutes.");
    }
    protected void cut(){
        System.out.println("Cutting the pizza into diagonal slices.");
    }
    protected void box(){
        System.out.println("Place pizza in official PizzaStore box.");
    }
}
// 奶酪披薩
public class CheesePizza extends Pizza {
    public CheesePizza(){
        this.name = "Cheese Pizza";
    }
}
// 蛤蜊披薩
public class ClamPizza extends Pizza {
    public ClamPizza(){
        this.name = "Clam Pizza";
    }
}
// 工廠類
public class SimplePizzaFactory {
    public static Pizza createPizza(int pizzaType){
        Pizza pizza = null;
        switch (pizzaType){
            case Pizza.CheesePizza:
                pizza = new CheesePizza();
                break;
            case Pizza.ClamPizza:
                pizza = new ClamPizza();
                break;
        }
        return pizza;
    }
}
// 披薩商店 :可看做客戶端
// 對(duì)客戶端來(lái)說(shuō)芹壕,去除了與具體產(chǎn)品的依賴汇四。
public class PizzaStore {
    public static Pizza orderPizza(int pizzaType){
        Pizza pizza;
        pizza = SimplePizzaFactory.createPizza(pizzaType);
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
}
  • 測(cè)試
// 訂購(gòu)一份奶酪披薩
PizzaStore.orderPizza(Pizza.CheesePizza);
// 訂購(gòu)一份蛤蜊披薩
PizzaStore.orderPizza(Pizza.ClamPizza);
TestResult.png

工廠方法模式

  • 定義
    工廠方法模式:定義了一個(gè)創(chuàng)建對(duì)象的接口,但由子類決定要實(shí)例化的類是哪一個(gè)踢涌。工廠方法讓類把實(shí)例化推遲到子類通孽。
  • 類圖
FactoryMethod.png
  • Class
// 創(chuàng)建者通常會(huì)包含依賴于抽象產(chǎn)品的代碼,而具體產(chǎn)品由子類制造睁壁,創(chuàng)建者不需要知道在制造哪種具體產(chǎn)品背苦。
public abstract class PizzaStore {
    public Pizza orderPizza(int pizzaType){
        Pizza pizza;
        pizza = createPizza(pizzaType);
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }

    // 工廠方法用來(lái)處理對(duì)象的創(chuàng)建互捌,并將這樣的行為封裝在子類中。
    public abstract Pizza createPizza(int pizzaType);
}
// 紐約披薩店(具體創(chuàng)建者)
public class NewYorkPizzaStore extends PizzaStore {
    // 實(shí)現(xiàn)createPizza方法行剂,創(chuàng)建紐約本地風(fēng)味的披薩秕噪。
    @Override
    public Pizza createPizza(int pizzaType) {
        Pizza pizza = null;
        switch (pizzaType){
            case Pizza.NewYork_CheesePizza:
                pizza = new NewYorkCheesePizza();
                break;
            case Pizza.NewYork_ClamPizza:
                pizza = new NewYorkClamPizza();
                break;
        }
        return pizza;
    }
}
// 芝加哥披薩店(具體創(chuàng)建者)
public class ChicagoPizzaStore extends PizzaStore {
    // 實(shí)現(xiàn)createPizza方法,創(chuàng)建芝加哥本地風(fēng)味的披薩硼讽。
    @Override
    public Pizza createPizza(int pizzaType) {
        Pizza pizza = null;
        switch (pizzaType){
            case Pizza.Chicago_CheesePizza:
                pizza = new ChicagoCheesePizza();
                break;
            case Pizza.Chicago_ClamPizza:
                pizza = new ChicagoClamPizza();
                break;
        }
        return pizza;
    }
}
// 披薩:抽象的產(chǎn)品或抽象的算法
// 此抽象類提供了某些默認(rèn)的基本做法
public abstract class Pizza {
    public static final int NewYork_CheesePizza = 1;
    public static final int NewYork_ClamPizza = 2;
    public static final int Chicago_CheesePizza = 3;
    public static final int Chicago_ClamPizza = 4;

    public String name;

    protected void prepare(){
        System.out.println("Preparing " + name);
    }
    protected void bake(){
        System.out.println("Bake for 25 minutes.");
    }
    protected void cut(){
        System.out.println("Cutting the pizza into diagonal slices.");
    }
    protected void box(){
        System.out.println("Place pizza in official PizzaStore box.");
    }
}
// 芝加哥奶酪披薩(具體產(chǎn)品)
public class ChicagoCheesePizza extends Pizza {
    public ChicagoCheesePizza(){
        this.name = "Chicago style cheese pizza";
    }
}
// 芝加哥蛤蜊披薩(具體產(chǎn)品)
public class ChicagoClamPizza extends Pizza {
    public ChicagoClamPizza(){
        this.name = "Chicago style clam pizza";
    }
}
// 紐約奶酪披薩(具體產(chǎn)品)
public class NewYorkCheesePizza extends Pizza {
    public NewYorkCheesePizza(){
        this.name = "New York style cheese pizza";
    }
}
// 紐約蛤蜊披薩(具體產(chǎn)品)
public class NewYorkClamPizza extends Pizza {
    public NewYorkClamPizza() {
        this.name = "New York clam pizza";
    }
}
  • 測(cè)試
PizzaStore newYorkPizzaStore = new NewYorkPizzaStore();
PizzaStore chicagoPizzaStore = new ChicagoPizzaStore();
// 訂購(gòu)一份紐約風(fēng)味的奶酪披薩
newYorkPizzaStore.orderPizza(Pizza.NewYork_CheesePizza);
// 訂購(gòu)一份芝加哥風(fēng)味的蛤蜊披薩
chicagoPizzaStore.orderPizza(Pizza.Chicago_ClamPizza);
TestResult.png

抽象工廠模式

  • 定義
    抽象工廠:提供一個(gè)接口巢价,用于創(chuàng)建相關(guān)或依賴對(duì)象的家族,而不需要明確指定具體類固阁。
    抽象工廠允許客戶使用抽象的接口來(lái)創(chuàng)建一組相關(guān)的產(chǎn)品壤躲,而不需要知道(或關(guān)心)實(shí)際產(chǎn)出的具體產(chǎn)品是什么。這樣一來(lái)备燃,客戶就從具體的產(chǎn)品中被解耦碉克。
  • 類圖
AbstractFactory.png
  • Class
// 為原料工廠定義一個(gè)接口,這個(gè)接口負(fù)責(zé)創(chuàng)建所有的原料并齐。
public interface PizzaIngredientFactory {
    // 生產(chǎn)面團(tuán)
    public Dough createDough();
    // 生產(chǎn)醬汁
    public Sauce createSauce();
}
// 紐約披薩原料工廠
public class NewYorkPizzaIngredientFactory implements PizzaIngredientFactory {
    @Override
    public Dough createDough() {
        return new ThinCrustDough();
    }
    @Override
    public Sauce createSauce() {
        return new MarinaraSauce();
    }
}
// 芝加哥披薩原料工廠
public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory {
    @Override
    public Dough createDough() {
        return new ThickCrustDough();
    }
    @Override
    public Sauce createSauce() {
        return new PlumTomatoSauce();
    }
}
// 面團(tuán)(原料)
public abstract class Dough {
    public String name;
}
// 醬汁(原料)
public abstract class Sauce {
    public String name;
}
// 薄脆面團(tuán)
public class ThinCrustDough extends Dough {
    public ThinCrustDough(){
        this.name = "New york style thin crust dough";
    }
}
// 厚餅面團(tuán)
public class ThickCrustDough extends Dough {
    public ThickCrustDough(){
        this.name = "Chicago style thick crust dough";
    }
}
// 意大利紅醬
public class MarinaraSauce extends Sauce {
    public MarinaraSauce(){
        this.name = "New york style marinara sauce";
    }
}
// 番茄醬
public class PlumTomatoSauce extends Sauce {
    public PlumTomatoSauce(){
        this.name = "Chicago style plum tomato sauce";
    }
}
// 披薩:抽象的產(chǎn)品或抽象的算法
// 此抽象類提供了某些默認(rèn)的基本做法
public abstract class Pizza {
    public static final int NewYork_CheesePizza = 1;
    public static final int NewYork_ClamPizza = 2;
    public static final int Chicago_CheesePizza = 3;
    public static final int Chicago_ClamPizza = 4;

    public String name;
    public Dough dough;
    public Sauce sauce;

    public void prepare(){
        System.out.println("Preparing " + name);
    }
    public void bake(){
        System.out.println("Bake for 25 minutes.");
    }
    public void cut(){
        System.out.println("Cutting the pizza into diagonal slices.");
    }
    public void box(){
        System.out.println("Place pizza in official PizzaStore box.");
    }
}
// 芝加哥奶酪披薩
public class ChicagoCheesePizza extends Pizza {
    private PizzaIngredientFactory ingredientFactory;
    public ChicagoCheesePizza(PizzaIngredientFactory ingredientFactory){
        this.name = "Chicago style cheese pizza";
        this.ingredientFactory = ingredientFactory;
    }
    @Override
    public void prepare() {
        super.prepare();
        // 生產(chǎn)面團(tuán)
        this.dough = ingredientFactory.createDough();
        // 生產(chǎn)醬汁
        this.sauce = ingredientFactory.createSauce();
        System.out.println("Preparing " + dough.name);
        System.out.println("Preparing " + sauce.name);
    }
}
// 紐約奶酪披薩
public class NewYorkCheesePizza extends Pizza {
    private PizzaIngredientFactory ingredientFactory;
    public NewYorkCheesePizza(PizzaIngredientFactory ingredientFactory){
        this.name = "New York style cheese pizza";
        this.ingredientFactory = ingredientFactory;
    }
    @Override
    public void prepare() {
        super.prepare();
        // 生產(chǎn)面團(tuán)
        this.dough = ingredientFactory.createDough();
        // 生產(chǎn)醬汁
        this.sauce = ingredientFactory.createSauce();
        System.out.println("Preparing " + dough.name);
        System.out.println("Preparing " + sauce.name);
    }
}
  • 測(cè)試
// 創(chuàng)建紐約原料工廠
PizzaIngredientFactory pizzaIngredientFactory = new NewYorkPizzaIngredientFactory();
// 創(chuàng)建紐約風(fēng)味披薩
Pizza newYorkCheesePizza = new NewYorkCheesePizza(pizzaIngredientFactory);
newYorkCheesePizza.prepare();
// 創(chuàng)建芝加哥原料工廠
PizzaIngredientFactory ingredientFactory = new ChicagoPizzaIngredientFactory();
// 創(chuàng)建芝加哥風(fēng)味披薩
Pizza chicagoCheesePizza = new ChicagoCheesePizza(ingredientFactory);
chicagoCheesePizza.prepare();
TestResult.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末漏麦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子况褪,更是在濱河造成了極大的恐慌撕贞,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件测垛,死亡現(xiàn)場(chǎng)離奇詭異捏膨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)食侮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門号涯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人锯七,你說(shuō)我怎么就攤上這事链快。” “怎么了眉尸?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵域蜗,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我效五,道長(zhǎng)地消,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任畏妖,我火速辦了婚禮脉执,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘戒劫。我一直安慰自己半夷,他們只是感情好婆廊,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著巫橄,像睡著了一般淘邻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上湘换,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天宾舅,我揣著相機(jī)與錄音,去河邊找鬼彩倚。 笑死筹我,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的帆离。 我是一名探鬼主播蔬蕊,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼哥谷!你這毒婦竟也來(lái)了岸夯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤们妥,失蹤者是張志新(化名)和其女友劉穎猜扮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體监婶,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡破镰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了压储。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡源譬,死狀恐怖集惋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情踩娘,我是刑警寧澤刮刑,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站养渴,受9級(jí)特大地震影響雷绢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜理卑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一翘紊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧藐唠,春花似錦帆疟、人聲如沸鹉究。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)自赔。三九已至,卻和暖如春柳琢,著一層夾襖步出監(jiān)牢的瞬間绍妨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工柬脸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留他去,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓肖粮,卻偏偏與公主長(zhǎng)得像孤页,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子涩馆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 客戶需求 程序設(shè)計(jì) 1行施、PizzaStore是用來(lái)給客戶下訂單買pizza的,所以每個(gè)PizzaStore都會(huì)有一...
    BlainPeng閱讀 548評(píng)論 0 2
  • 本文屬于系列文章《設(shè)計(jì)模式》魂那,附上文集鏈接不知道看上一篇的時(shí)候蛾号,有沒有看到一個(gè)問題,如果只是簡(jiǎn)單的工廠涯雅,為什么要一...
    l_sivan閱讀 685評(píng)論 1 1
  • 源碼地址 使用場(chǎng)景 一個(gè)對(duì)象族有相同的約束時(shí)可以使用此模式鲜结。 例如:Android、iOS 都有短信軟件和撥號(hào)軟件...
    yangMr閱讀 421評(píng)論 0 1
  • 創(chuàng)建型設(shè)計(jì)模式: 簡(jiǎn)單工廠模式活逆、工廠方法模式精刷、抽象工廠模式、單例模式蔗候、原型模式和建造者模式怒允。 統(tǒng)共六種。 本此分享...
    markfork閱讀 418評(píng)論 0 2
  • github @Shin_jk_625 blog 由于scrapy足夠直觀和友好锈遥,所以嘗試用它寫一個(gè)簡(jiǎn)單的exhe...
    jk625x閱讀 3,449評(píng)論 0 1