一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java設計模式--三種工廠模式詳解

java設計模式--三種工廠模式詳解

2021-10-16 13:44吾仄lo咚鏘 Java教程

這篇文章主要為大家詳細介紹了Java設計模式之工廠模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助

簡單工廠

簡單工廠模式是屬于創建型模式,是工廠模式的一種。簡單工廠模式是由一個工廠對象決定創建出哪一種產品類的實例。定義了一個創建對象的類,由這個類來封裝實例化對象的行為(代碼)。當我們會用到大量的創建某種、某類或者某批對象時,就會使用到工廠模式。

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

java設計模式--三種工廠模式詳解

  • Product表示產品接口,也可用抽象類實現,封裝產品間共有的屬性。
  • ConcreteProduct*表示具體的實際產品。
  • Factory表示工廠,工廠根據需要來創建相應的產品。

這樣一來,當添加新的產品C時,只需要修改工廠部分代碼即可,而傳統方法需要在每一個創建產品的地方都進行修改。可以理解為把具體的產品創建封裝成一個工廠類。

舉個例子,大富翁的地圖創建:

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

類圖:

java設計模式--三種工廠模式詳解

 

 

代碼:

 

 

1.產品接口

public interface AbstractBlock {
    public void printBlock();
}

 

2.產品接口實現子類

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){ //根據傳參創建不同的地塊
        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.調用工廠

public class Map {
    public void getMap(){
        SimpleFactory simpleFactory=new SimpleFactory();  //實例化工廠
        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++){  //隨機用工廠創建地塊并放入集合
            int tt = rd.nextInt(types.length);
            map.add(simpleFactory.getBlock(types[tt]));
        }
        //地圖大小寫死了,不是重點
        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();
    }
}

運行結果

java設計模式--三種工廠模式詳解

 

工廠方法

不難發現,當增加新的產品時需要對簡單工廠類修改,或創建多個簡單工廠。(比如增加一個法院地塊)工廠方法進一步解耦合,把工廠類抽象,不再負責所有實例的創建,而是把具體的創建工作交給了子類去完成,實例化延遲到子類加載,由子類來決定要實例化的類。

java設計模式--三種工廠模式詳解

抽象化工廠類,把具體實例化工作交給其子類實現。

代碼:

 

1.工廠接口

public interface AbstractFactory {
    public AbstractBlock createBlock();
}

 

2.工廠實現子類

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.產品接口

public interface AbstractBlock {
    public void printBlock();
}

 

4.產品實現子類

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.調用

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++){  //隨機用工廠創建地塊并放入集合
            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());
        }
        //地圖大小寫死了,不是重點
        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();
    }
}

運行結果:

java設計模式--三種工廠模式詳解

 

抽象工廠

不難發現當創建新的產品接口時,也需要對工廠方法修改,或創建多個工廠方法。(比如增加魔法地塊簇,對應組產品魔法公園、魔法空地、魔法監獄等)

抽象工廠將工廠方法進一步抽象。定義了一個接口用于創建相關或有依賴關系的對象簇,而無需指明具體的類。可以根據創建對象類型使用對應的工廠子類。這樣將單個的簡單工廠類變成了工廠簇,更利于代碼的維護和擴展。

java設計模式--三種工廠模式詳解

把工廠類抽象后,對應不同子類工廠(普通/魔法),生產對應的一組產品。最后調用時統一調用抽象接口即可,不必知道具體對象,面向接口編程。

1.產品接口

public interface AbstractBlock {
    void printBlock();
}

 

2.產品抽象子類-普通產品

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普通監獄

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

 

3.1產品抽象子類-魔法產品

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魔法監獄

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

 

4.工廠接口

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

 

5.工廠實現子類-普通工廠

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

 

6.工廠實現子類-魔法工廠

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

 

7.調用

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("請輸入指令(1輸出普通地圖,2輸出魔法地圖)");
        int order;
        order  = scan.nextInt();
        if(order == 1){
            map.getMap(new NormalFactory());
        }else{
            map.getMap(new MagicFactory());
        }
    }
}

運行結果:

java設計模式--三種工廠模式詳解

java設計模式--三種工廠模式詳解

 

總結

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!

原文鏈接:https://wzlodq.blog.csdn.net/article/details/110143303

延伸 · 閱讀

精彩推薦
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7472021-02-04
主站蜘蛛池模板: 久久亚洲国产成人影院 | 国产成人精品午夜在线播放 | 日本情趣视频 | 毛片a级放荡的护士hd | 美女国内精品自产拍在线播放 | 久久综合老色鬼网站 | 恩不要好大好硬好爽3p | 国产区成人精品视频 | 国产成人 免费观看 | 天天做天天爽 | 99久久精品99999久久 | 四虎黄色影视库 | 国产在线欧美日韩精品一区二区 | 亚洲AV无码国产精品色在线看 | kisssis无减删全集在线观看 | 日本人与黑人做爰视频网站 | 成人亚洲精品一区 | 精品第一国产综合精品蜜芽 | 国产在线精品香蕉综合网一区 | 国内精品视频九九九九 | 久久亚洲成a人片 | 4虎tv | 欧式午夜理伦三级在线观看 | 精品国产自在现线久久 | 99精品国产高清一区二区三区香蕉 | 女人把扒开给男人爽的 | 很黄的孕妇a级黄毛片 | 精精国产www视频在线观看免费 | 火影忍者小南裸羞羞漫画 | 亚洲人成综合在线播放 | 女人pp被扒开流水了 | 娇妻与公陈峰姚瑶最新版 | 国产婷婷成人久久av免费高清 | 精品午夜久久福利大片免费 | 国产专区日韩精品欧美色 | www.俺去啦 | 91九色视频无限观看免费 | 亚洲精品久久久成人 | 小鸟酱视频在线观看 | 男女小视频在线观看 | 2012在线观看免费视频大全 |