溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中有哪些工廠模式

發(fā)布時間:2021-07-20 10:37:11 來源:億速云 閱讀:130 作者:Leah 欄目:開發(fā)技術

今天就跟大家聊聊有關java中有哪些工廠模式,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

    簡單工廠

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

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

    java中有哪些工廠模式

    • Product表示產品接口,也可用抽象類實現,封裝產品間共有的屬性。

    • ConcreteProduct*表示具體的實際產品。

    • Factory表示工廠,工廠根據需要來創(chuàng)建相應的產品。

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

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

    • AbstractBlock是接口,表示抽象的地塊,包括方法printBlock()打印地塊。

    • Empty、Prison、Park實現上述接口,表示空地(*)、監(jiān)獄(&)和公園(#)。

    • SimpleFactory是創(chuàng)建地塊的簡單工廠。

    類圖:

    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){ //根據傳參創(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.調用工廠
    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++){  //隨機用工廠創(chuàng)建地塊并放入集合
                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中有哪些工廠模式

    工廠方法

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

    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++){  //隨機用工廠創(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());
            }
            //地圖大小寫死了,不是重點
            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中有哪些工廠模式

    抽象工廠

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

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

    java中有哪些工廠模式

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

    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普通監(jiān)獄

    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魔法監(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.工廠實現子類-普通工廠

    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中有哪些工廠模式

    看完上述內容,你們對java中有哪些工廠模式有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業(yè)資訊頻道,感謝大家的支持。

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI