最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java設(shè)計(jì)模式--三種工廠模式詳解

 更新時(shí)間:2021年07月19日 14:55:48   作者:吾仄lo咚鏘  
這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式之工廠模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助

簡單工廠

簡單工廠模式是屬于創(chuàng)建型模式,是工廠模式的一種。簡單工廠模式是由一個(gè)工廠對(duì)象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例。定義了一個(gè)創(chuàng)建對(duì)象的類,由這個(gè)類來封裝實(shí)例化對(duì)象的行為(代碼)。當(dāng)我們會(huì)用到大量的創(chuàng)建某種、某類或者某批對(duì)象時(shí),就會(huì)使用到工廠模式。

由于創(chuàng)建實(shí)例的方法通常為靜態(tài)(static)方法,因此簡單工廠模式又被成為靜態(tài)工廠方法模式(Static Factory Method)。

在這里插入圖片描述

  • Product表示產(chǎn)品接口,也可用抽象類實(shí)現(xiàn),封裝產(chǎn)品間共有的屬性。
  • ConcreteProduct*表示具體的實(shí)際產(chǎn)品。
  • Factory表示工廠,工廠根據(jù)需要來創(chuàng)建相應(yīng)的產(chǎn)品。

這樣一來,當(dāng)添加新的產(chǎn)品C時(shí),只需要修改工廠部分代碼即可,而傳統(tǒng)方法需要在每一個(gè)創(chuàng)建產(chǎn)品的地方都進(jìn)行修改??梢岳斫鉃榘丫唧w的產(chǎn)品創(chuàng)建封裝成一個(gè)工廠類。

舉個(gè)例子,大富翁的地圖創(chuàng)建:

  • AbstractBlock是接口,表示抽象的地塊,包括方法printBlock()打印地塊。
  • Empty、Prison、Park實(shí)現(xiàn)上述接口,表示空地(*)、監(jiān)獄(&)和公園(#)。
  • SimpleFactory是創(chuàng)建地塊的簡單工廠。

類圖:

在這里插入圖片描述

代碼:

1.產(chǎn)品接口

public interface AbstractBlock {
    public void printBlock();
}

2.產(chǎn)品接口實(shí)現(xiàn)子類

public class Empty implements AbstractBlock{
    @Override
    public void printBlock() {
        System.out.print("* ");
    }
}
public class Park implements AbstractBlock{
    @Override
    public void printBlock() {
        System.out.print("# ");
    }
}
public class Prison implements AbstractBlock{
    @Override
    public void printBlock() {
        System.out.print("& ");
    }
}

3.簡單工廠類

public class SimpleFactory {
    public AbstractBlock getBlock(String type){ //根據(jù)傳參創(chuàng)建不同的地塊
        if(type.equalsIgnoreCase("Empty")){
            return new Empty();
        } else if(type.equalsIgnoreCase("Park")){
            return new Park();
        } else if(type.equalsIgnoreCase("Prison")){
            return new Prison();
        }
        return null;
    }
}

4.調(diào)用工廠

public class Map {
    public void getMap(){
        SimpleFactory simpleFactory=new SimpleFactory();  //實(shí)例化工廠
        ArrayList<AbstractBlock> map=new ArrayList<AbstractBlock>();  //地塊集合
        String []types=new String[3];
        types[0]="Empty";
        types[1]="park";
        types[2]="Prison";
        Random rd = new Random();
        for(int i=1;i<=12;i++){  //隨機(jī)用工廠創(chuàng)建地塊并放入集合
            int tt = rd.nextInt(types.length);
            map.add(simpleFactory.getBlock(types[tt]));
        }
        //地圖大小寫死了,不是重點(diǎn)
        for(int i=0;i<12;i++){
            map.get(i).printBlock();
            if(i==3||i==5||i==7)
                System.out.println();
            if(i==4||i==6)
                System.out.print("    ");
        }
    }
}

5.測試

public class MonoPoly {
    public static void main(String[] args) {
        Map map=new Map();
        map.getMap();
    }
}

運(yùn)行結(jié)果

在這里插入圖片描述

工廠方法

不難發(fā)現(xiàn),當(dāng)增加新的產(chǎn)品時(shí)需要對(duì)簡單工廠類修改,或創(chuàng)建多個(gè)簡單工廠。(比如增加一個(gè)法院地塊)工廠方法進(jìn)一步解耦合,把工廠類抽象,不再負(fù)責(zé)所有實(shí)例的創(chuàng)建,而是把具體的創(chuàng)建工作交給了子類去完成,實(shí)例化延遲到子類加載,由子類來決定要實(shí)例化的類。

在這里插入圖片描述

抽象化工廠類,把具體實(shí)例化工作交給其子類實(shí)現(xiàn)。

代碼:

1.工廠接口

public interface AbstractFactory {
    public AbstractBlock createBlock();
}

2.工廠實(shí)現(xiàn)子類

public class EmptyFactory implements AbstractFactory {
    @Override
    public AbstractBlock createBlock() {
        return new Empty();
    }
}
public class ParkFactory implements AbstractFactory {
    @Override
    public AbstractBlock createBlock() {
        return new Park();
    }
}
public class PrisonFactory implements AbstractFactory {
    @Override
    public AbstractBlock createBlock() {
        return new Prison();
    }
}

3.產(chǎn)品接口

public interface AbstractBlock {
    public void printBlock();
}

4.產(chǎn)品實(shí)現(xiàn)子類

public class Empty implements AbstractBlock {
    @Override
    public void printBlock() {
        System.out.print("* ");
    }
}
public class Park implements AbstractBlock {
    @Override
    public void printBlock() {
        System.out.print("# ");
    }
}
public class Prison implements AbstractBlock {
    @Override
    public void printBlock() {
        System.out.print("& ");
    }
}

5.調(diào)用

public class Map {
    public void getMap() {
        ArrayList<AbstractBlock> map=new ArrayList<AbstractBlock>();  //地塊集合
        AbstractFactory abstractFactory;
        Random rd = new Random();
        for(int i=1;i<=12;i++){  //隨機(jī)用工廠創(chuàng)建地塊并放入集合
            int tt = rd.nextInt(3);
            if(tt==0)abstractFactory=new EmptyFactory();
            else if(tt==1)abstractFactory=new ParkFactory();
            else abstractFactory=new PrisonFactory();
            map.add(abstractFactory.createBlock());
        }
        //地圖大小寫死了,不是重點(diǎn)
        for(int i=0;i<12;i++){
            map.get(i).printBlock();
            if(i==3||i==5||i==7)
                System.out.println();
            if(i==4||i==6)
                System.out.print("    ");
        }
    }
}

6.測試

public class MonoPoly {
    public static void main(String[] args) {
        Map map=new Map();
        map.getMap();
    }
}

運(yùn)行結(jié)果:

在這里插入圖片描述

抽象工廠

不難發(fā)現(xiàn)當(dāng)創(chuàng)建新的產(chǎn)品接口時(shí),也需要對(duì)工廠方法修改,或創(chuàng)建多個(gè)工廠方法。(比如增加魔法地塊簇,對(duì)應(yīng)組產(chǎn)品魔法公園、魔法空地、魔法監(jiān)獄等)

抽象工廠將工廠方法進(jìn)一步抽象。定義了一個(gè)接口用于創(chuàng)建相關(guān)或有依賴關(guān)系的對(duì)象簇,而無需指明具體的類??梢愿鶕?jù)創(chuàng)建對(duì)象類型使用對(duì)應(yīng)的工廠子類。這樣將單個(gè)的簡單工廠類變成了工廠簇,更利于代碼的維護(hù)和擴(kuò)展。

在這里插入圖片描述

把工廠類抽象后,對(duì)應(yīng)不同子類工廠(普通/魔法),生產(chǎn)對(duì)應(yīng)的一組產(chǎn)品。最后調(diào)用時(shí)統(tǒng)一調(diào)用抽象接口即可,不必知道具體對(duì)象,面向接口編程。

1.產(chǎn)品接口

public interface AbstractBlock {
    void printBlock();
}

2.產(chǎn)品抽象子類-普通產(chǎn)品

public abstract class NormalAbstractBlock implements AbstractBlock {
    public abstract void printBlock();
}

2.2普通空地

public class NormalEmpty extends NormalAbstractBlock {
    public void printBlock() {
        System.out.print("* ");
    }
}

2.3普通公園

public class NormalPark  extends NormalAbstractBlock {
    public void printBlock() {
        System.out.print("# ");
    }
}

2.4普通監(jiān)獄

public class NormalPrison extends NormalAbstractBlock {
    public void printBlock() {
        System.out.print("& ");
    }
}

3.1產(chǎn)品抽象子類-魔法產(chǎn)品

public abstract class MagicAbstractBlock implements AbstractBlock {
    public abstract void printBlock();
}

3.2魔法空地

public class MagicEmpty  extends MagicAbstractBlock {
    public void printBlock() {
        System.out.print("e ");
    }
}

3.3魔法公園

public class MagicPark extends MagicAbstractBlock {
    public void printBlock() {
        System.out.print("g ");
    }
}

3.4魔法監(jiān)獄

public class MagicPrison extends MagicAbstractBlock {
    public void printBlock() {
        System.out.print("p ");
    }
}

4.工廠接口

public interface AbstractFactory {
    AbstractBlock getEmpty();
    AbstractBlock getPrison();
    AbstractBlock getPark();
}

5.工廠實(shí)現(xiàn)子類-普通工廠

public class NormalFactory implements  AbstractFactory {
    public AbstractBlock getEmpty() { return new NormalEmpty(); }
    public AbstractBlock getPrison() { return new NormalPrison(); }
    public AbstractBlock getPark() { return new NormalPark(); }
}

6.工廠實(shí)現(xiàn)子類-魔法工廠

public class MagicFactory implements AbstractFactory {
    public AbstractBlock getEmpty() { return new MagicEmpty(); }
    public AbstractBlock getPrison() {return new MagicPrison(); }
    public AbstractBlock getPark() { return new MagicPark(); }
}

7.調(diào)用

public class Map {
    public void getMap(AbstractFactory af){
        ArrayList<AbstractBlock> map=new ArrayList<AbstractBlock>();
        map.add(af.getEmpty());
        map.add(af.getPrison());
        map.add(af.getPark());
        Random rd = new Random(3);
        int col=12;
        for(int i=1;i<=col;i++){
            int tt = rd.nextInt(3);
            map.get(tt).printBlock();
            if(i==4||i==6||i==8)
                System.out.println();
            if(i==5||i==7)
                System.out.print("    ");
        }
    }
}

8.測試

public class Monopoly {
    public void play(){
        Map map=new Map();
        Scanner scan = new Scanner(System.in);
        System.out.println("請(qǐng)輸入指令(1輸出普通地圖,2輸出魔法地圖)");
        int order;
        order  = scan.nextInt();
        if(order == 1){
            map.getMap(new NormalFactory());
        }else{
            map.getMap(new MagicFactory());
        }
    }
}

運(yùn)行結(jié)果:

在這里插入圖片描述

在這里插入圖片描述

總結(jié)

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Java查看線程運(yùn)行狀態(tài)的方法詳解

    Java查看線程運(yùn)行狀態(tài)的方法詳解

    這篇文章主要為大家詳細(xì)介紹了Java語言如何查看線程運(yùn)行狀態(tài)的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-08-08
  • 利用Java實(shí)現(xiàn)圖片轉(zhuǎn)化為ASCII圖的示例代碼

    利用Java實(shí)現(xiàn)圖片轉(zhuǎn)化為ASCII圖的示例代碼

    本文將詳細(xì)講解如何利用 Java 實(shí)現(xiàn)圖片轉(zhuǎn)化為 ASCII 圖,從項(xiàng)目背景與意義、相關(guān)技術(shù)知識(shí),到系統(tǒng)需求與架構(gòu)設(shè)計(jì),再到詳細(xì)實(shí)現(xiàn)思路、完整代碼和代碼解讀,最后對(duì)項(xiàng)目進(jìn)行總結(jié)與展望,需要的朋友可以參考下
    2025-03-03
  • 詳解Java中方法next()和nextLine()的區(qū)別與易錯(cuò)點(diǎn)

    詳解Java中方法next()和nextLine()的區(qū)別與易錯(cuò)點(diǎn)

    這篇文章主要介紹了詳解Java中方法next()和nextLine()的區(qū)別與易錯(cuò)點(diǎn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • JVM(Java?Virtual?Machine,Java虛擬機(jī))的作用詳解

    JVM(Java?Virtual?Machine,Java虛擬機(jī))的作用詳解

    JVM是Java語言實(shí)現(xiàn)“一次編寫,到處運(yùn)行”特性的基石,也是Java平臺(tái)的核心組成部分,其主要作用包括平臺(tái)無關(guān)性、內(nèi)存管理、運(yùn)行Java程序、安全性以及性能優(yōu)化,通過這些功能,JVM確保了Java程序的可移植性、高效性和安全性
    2025-03-03
  • Java this super代碼實(shí)例及使用方法總結(jié)

    Java this super代碼實(shí)例及使用方法總結(jié)

    這篇文章主要介紹了Java this super代碼實(shí)例及使用方法總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • java web實(shí)現(xiàn)郵箱發(fā)送功能

    java web實(shí)現(xiàn)郵箱發(fā)送功能

    這篇文章主要為大家詳細(xì)介紹了java web實(shí)現(xiàn)郵箱發(fā)送功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • java 輸入某年某月某日,判斷這一天是這一年的第幾天

    java 輸入某年某月某日,判斷這一天是這一年的第幾天

    這篇文章主要介紹了java 輸入某年某月某日,判斷這一天是這一年的第幾天,需要的朋友可以參考下
    2017-02-02
  • Java面試之SQL語句題經(jīng)典案例

    Java面試之SQL語句題經(jīng)典案例

    本文詳細(xì)討論了如何將行數(shù)據(jù)轉(zhuǎn)化為列數(shù)據(jù),并提供了多種SQL查詢練習(xí)題,包括查詢特定條件的學(xué)生信息、課程成績比較、學(xué)生成績排名等,文章還解釋了在SQL中使用Union、UnionAll和pivot的方法,以及如何處理復(fù)雜的SQL查詢問題,需要的朋友可以參考下
    2024-10-10
  • java判斷請(qǐng)求是來自PC端還是手機(jī)端小技巧

    java判斷請(qǐng)求是來自PC端還是手機(jī)端小技巧

    這篇文章主要為大家介紹了java判斷請(qǐng)求是來自PC端還是手機(jī)端小技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Java多線程之深入理解ReentrantLock

    Java多線程之深入理解ReentrantLock

    這篇文章主要介紹了Java多線程之深入理解ReentrantLock,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04

最新評(píng)論

安福县| 昌邑市| 固阳县| 陆川县| 北安市| 德令哈市| 泰来县| 津南区| 新和县| 渭源县| 鲁山县| 苍南县| 娄烦县| 利川市| 内丘县| 安塞县| 大城县| 诸城市| 信阳市| 璧山县| 绥江县| 元朗区| 和林格尔县| 无极县| 新邵县| 兴城市| 江永县| 饶阳县| 外汇| 芜湖县| 辉县市| 秭归县| 镇坪县| 庆城县| 武冈市| 道真| 漳州市| 德清县| 隆昌县| 胶州市| 三门峡市|