亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Java設計模式之工廠模式詳解

Rocture / 2807人閱讀

摘要:工廠模式,又稱為工廠方法模式。工廠模式,也就是工廠方法模式是解決了簡單工廠要修改代碼的問題,他把對象的創(chuàng)建操作延遲到子類工廠中,這樣新增產(chǎn)品就不需要修改代碼。

簡單工廠其實并不是設計模式,只是一種編程習慣。

首先我們創(chuàng)建父類Cup,所有杯子類的父類。再創(chuàng)建它的子類BigCup和SmallCup類。

public abstract class Cup {
    public abstract void use();
}

public class BigCup extends Cup {
    @Override
    public void use() {
        System.out.println("大杯裝500ml水");
    }
}

public class SmallCup extends Cup {
    @Override
    public void use() {
        System.out.println("小杯裝100ml水");
    }
}

然后我們創(chuàng)建工廠類CupFactory,工廠里聲明了Cup引用,根據(jù)傳入的參數(shù)type來判斷生產(chǎn)什么類型的杯子,這樣外部只需要傳入類型就可以生成想要的類型的對象,現(xiàn)在運行看一下結果,沒有問題。

public class CupFactory{
    public Cup makeCup(String type){
        Cup cup = null;
        if (type.equals("big")){
            cup = new BigCup();
        }else if (type.equals("small")){
            cup = new SmallCup();
        }
        return cup;
    }
}

public static void main(String[] args){
    CupFactory cupFactory = new CupFactory();
    Cup smallCup = cupFactory.makeCup("small");
    smallCup.use();
    Cup bigCup = cupFactory.makeCup("big");
    bigCup.use();
}


結果:
小杯裝100ml水
大杯裝500ml水

簡單工廠雖然解決了一些問題但是當我們的需要增加子類的時候就很麻煩了,需要修改工廠類里的代碼,違反了開放封閉原則,所以我們現(xiàn)在使用真正的工廠模式來解決這個問題。

工廠模式,又稱為工廠方法模式。定義了一個創(chuàng)建產(chǎn)品對象的工廠接口,將實際創(chuàng)建工作推遲到子類工廠當中。

首先我們創(chuàng)建抽象類Tableware,代表所有餐具的父類,再創(chuàng)建一個抽象工廠類TablewareFactory,抽象工廠里面有抽象方法makeTableware來制造餐具。然后我們創(chuàng)建4個餐具子類,分別是BigBowl、SmallBowl、BigCuphe和SmallCup。

public abstract class Tableware {
    public abstract void use();
}

public abstract class TableWareFactory {
    public abstract Tableware makeTableware(String type);
}

public class BigBowl extends Tableware {
    @Override
    public void use() {
        System.out.println("大碗裝500g飯");
    }
}

public class SmallBowl extends Tableware {
    @Override
    public void use() {
        System.out.println("小碗裝100g飯");
    }
}

public class BigCup extends Tableware {
    @Override
    public void use() {
        System.out.println("大杯裝500ml水");
    }
}

public class SmallCup extends Tableware {
    @Override
    public void use() {
        System.out.println("小杯裝100ml水");
    }
}

接下來我們需要實現(xiàn)工廠類了,這是最關鍵的部分,從上述4個子類可以看出,BigBowl和SmallBowl是一類產(chǎn)品,而BigCup和SamllCup是另一類,所以我們創(chuàng)建兩個子類工廠,分別是BowlFactory和CupFactory。它們生產(chǎn)不同的產(chǎn)品,但是又能根據(jù)參數(shù)來生產(chǎn)不同規(guī)格的同類產(chǎn)品。在子類工廠中的makeTableware方法才是決定生產(chǎn)什么產(chǎn)品,而父類工廠并不知道,這就是將實際創(chuàng)建工作推遲到子類工廠當中。當我們想要新建別的產(chǎn)品的時候增加新的子類工廠即可。

public class BowlFactory extends TableWareFactory {

    @Override
    public Tableware makeTableware(String type) {
        Tableware tableware = null;
        if (type.equals("big")){
            tableware = new BigBowl();
        }else if (type.equals("small")){
            tableware = new SmallBowl();
        }
        return tableware;
    }
}

public class CupFactory extends TableWareFactory {
    @Override
    public Tableware makeTableware(String type) {
        Tableware tableware = null;
        if (type.equals("big")){
            tableware = new BigCup();
        }else if (type.equals("small")){
            tableware = new SmallCup();
        }
        return tableware;
    }
}

測試一下看看結果,結果沒有問題。

TableWareFactory cupFactory = new CupFactory();
Tableware bigCup = cupFactory.makeTableware("big");
bigCup.use();
Tableware smallCup = cupFactory.makeTableware("small");
smallCup.use();
TableWareFactory bowlFactory = new BowlFactory();
Tableware bigBowl =  bowlFactory.makeTableware("big");
bigBowl.use();
Tableware smallBowl = bowlFactory.makeTableware("small");
smallBowl.use();

結果:
大杯裝500ml水
小杯裝100ml水
大碗裝500g飯
小碗裝100g飯

抽象工廠模式其實是在工廠方法模式的基礎上加入了產(chǎn)品族的概念,也就是工廠里會生產(chǎn)多種產(chǎn)品,他們需要配套使用,例如衣服和褲子。

我們先創(chuàng)建一個抽象工廠BaseFactory類,有兩個抽象方法makeTableware和getFood,分別生產(chǎn)餐具和食物,因為它們兩個是要配合使用的。

public abstract class BaseFactory {
    public abstract Tableware makeTableware();
    public abstract  Food getFood();
}

然后我們創(chuàng)建餐具的抽象父類Tableware和事物的抽象父類Food,再創(chuàng)建它們的子類BigBowl、SmallCup、Meat和Milk類。

public abstract class Tableware {
    public abstract void use();
}

public abstract class Food {
    public abstract void name();
}

public class BigBowl extends Tableware {
    @Override
    public void use() {
        System.out.println("500ml的大碗");
    }
}

public class SmallCup extends Tableware {
    @Override
    public void use() {
        System.out.println("100ml的小杯子");
    }
}

public class Meat extends Food {
    @Override
    public void name() {
        System.out.println("肉");
    }
}

public class Milk extends Food {
    @Override
    public void name() {
        System.out.println("牛奶");
    }
}

接下來我們創(chuàng)建兩個子類工廠MeatWithBowlFactory和MilkWithCupFactory
類,這兩個類把肉和碗分到一個工廠里,牛奶和杯子分到一個工廠里,表示他們需要配套使用。這里的makeTableware和getFood方法也可以像上面工廠方法模式里一樣接受參數(shù)生成不同規(guī)格的產(chǎn)品,現(xiàn)在是直接返回一個對象。

public class MeatWithBowlFactory extends BaseFactory {
    @Override
    public Tableware makeTableware() {
        return new BigBowl();
    }

    @Override
    public Food getFood() {
        return new Meat();
    }
}

public class MilkWithCupFactory extends BaseFactory{
    @Override
    public Tableware makeTableware() {
        return new SmallCup();
    }

    @Override
    public Food getFood() {
        return new Milk();
    }
}

現(xiàn)在測試一下結果,沒有問題,同一個工廠可以生產(chǎn)需要配套的產(chǎn)品。

   BaseFactory baseFactory;
   baseFactory = new MeatWithBowlFactory();
   BigBowl bigBowl = (BigBowl) baseFactory.makeTableware();
   bigBowl.use();
   Meat meat = (Meat)baseFactory.getFood();
   meat.name();

   baseFactory = new MilkWithCupFactory();
   SmallCup smallCup = (SmallCup) baseFactory.makeTableware();
   smallCup.use();
   Milk milk = (Milk)baseFactory.getFood();
   milk.name();

結果:
500ml的大碗

100ml的小杯子
牛奶

總結:

簡單工廠模式其實只是把創(chuàng)建對象這個常用的工廠做成工廠類方便調(diào)用,但是修改的時候需要修改工廠的代碼,只是一種編程習慣,不是設計模式。

工廠模式,也就是工廠方法模式是解決了簡單工廠要修改代碼的問題,他把對象的創(chuàng)建操作延遲到子類工廠中,這樣新增產(chǎn)品就不需要修改代碼。

抽象工廠模式就是在工廠方法模式的基礎上加入了產(chǎn)品族的概念,如果幾個產(chǎn)品需要配套使用,就可以將他們放在同一個工廠里自行選擇搭配,比如牛肉放在瓷碗里,豬肉放在鐵碗里。

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://www.ezyhdfw.cn/yun/69069.html

相關文章

  • 一天一個設計模式JS實現(xiàn)——工廠模式

    摘要:參考文章深入理解三種工廠模式工廠模式,工廠方法模式,抽象工廠模式詳解工廠模式是中最常用的設計模式之一。這種類型的設計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。 參考文章:深入理解java三種工廠模式工廠模式,工廠方法模式,抽象工廠模式 詳解 工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。這種類型的設計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的...

    Muninn 評論0 收藏0
  • Java - 收藏集 - 掘金

    摘要:強大的表單驗證前端掘金支持非常強大的內(nèi)置表單驗證,以及。面向對象和面向過程的區(qū)別的種設計模式全解析后端掘金一設計模式的分類總體來說設計模式分為三大類創(chuàng)建型模式,共五種工廠方法模式抽象工廠模式單例模式建造者模式原型模式。 強大的 Angular 表單驗證 - 前端 - 掘金Angular 支持非常強大的內(nèi)置表單驗證,maxlength、minlength、required 以及 patt...

    XiNGRZ 評論0 收藏0
  • 忘了再看設計模式-創(chuàng)建型

    摘要:推文經(jīng)典設計模式之五大創(chuàng)建型模式附實例和詳解工廠三兄弟之簡單工廠模式一建造者模式概述手牽手一步兩步三步四步望著天。一步步構建復雜對象推文設計模式二建造者模式建造者模式原型模式概述聽我說中藥苦,抄襲應該更苦。 單例模式 概述: 你是我唯一想要的了解。《七里香》 有且僅有一個實例,與能訪問它的全局靜態(tài)方法。 實現(xiàn):餓漢、懶漢、雙重鎖、靜態(tài)內(nèi)部類、枚舉。 難點:在考慮線程安全、序列化、反射、...

    Michael_Ding 評論0 收藏0
  • php設計模式

    摘要:我們今天也來做一個萬能遙控器設計模式適配器模式將一個類的接口轉換成客戶希望的另外一個接口。今天要介紹的仍然是創(chuàng)建型設計模式的一種建造者模式。設計模式的理論知識固然重要,但 計算機程序的思維邏輯 (54) - 剖析 Collections - 設計模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對容器接口對象進行操作,第二類是返回一個容器接口對象,上節(jié)我們介紹了...

    Dionysus_go 評論0 收藏0

發(fā)表評論

0條評論

Rocture

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<