您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關java中有哪些工廠模式,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
簡單工廠模式是屬于創建型模式,是工廠模式的一種。簡單工廠模式是由一個工廠對象決定創建出哪一種產品類的實例。定義了一個創建對象的類,由這個類來封裝實例化對象的行為(代碼)。當我們會用到大量的創建某種、某類或者某批對象時,就會使用到工廠模式。
由于創建實例的方法通常為靜態(static)方法,因此簡單工廠模式又被成為靜態工廠方法模式(Static Factory Method)。
Product表示產品接口,也可用抽象類實現,封裝產品間共有的屬性。
ConcreteProduct*表示具體的實際產品。
Factory表示工廠,工廠根據需要來創建相應的產品。
這樣一來,當添加新的產品C時,只需要修改工廠部分代碼即可,而傳統方法需要在每一個創建產品的地方都進行修改。可以理解為把具體的產品創建封裝成一個工廠類。
舉個例子,大富翁的地圖創建:
AbstractBlock是接口,表示抽象的地塊,包括方法printBlock()打印地塊。
Empty、Prison、Park實現上述接口,表示空地(*)、監獄(&)和公園(#)。
SimpleFactory是創建地塊的簡單工廠。
類圖:
public interface AbstractBlock { public void printBlock(); }
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("& "); } }
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; } }
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(" "); } } }
public class MonoPoly { public static void main(String[] args) { Map map=new Map(); map.getMap(); } }
運行結果
不難發現,當增加新的產品時需要對簡單工廠類修改,或創建多個簡單工廠。(比如增加一個法院地塊)工廠方法進一步解耦合,把工廠類抽象,不再負責所有實例的創建,而是把具體的創建工作交給了子類去完成,實例化延遲到子類加載,由子類來決定要實例化的類。
抽象化工廠類,把具體實例化工作交給其子類實現。
public interface AbstractFactory { public AbstractBlock createBlock(); }
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(); } }
public interface AbstractBlock { public void printBlock(); }
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("& "); } }
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(" "); } } }
public class MonoPoly { public static void main(String[] args) { Map map=new Map(); map.getMap(); } }
運行結果:
不難發現當創建新的產品接口時,也需要對工廠方法修改,或創建多個工廠方法。(比如增加魔法地塊簇,對應組產品魔法公園、魔法空地、魔法監獄等)
抽象工廠將工廠方法進一步抽象。定義了一個接口用于創建相關或有依賴關系的對象簇,而無需指明具體的類。可以根據創建對象類型使用對應的工廠子類。這樣將單個的簡單工廠類變成了工廠簇,更利于代碼的維護和擴展。
把工廠類抽象后,對應不同子類工廠(普通/魔法),生產對應的一組產品。最后調用時統一調用抽象接口即可,不必知道具體對象,面向接口編程。
public interface AbstractBlock { void printBlock(); }
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("& "); } }
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 "); } }
public interface AbstractFactory { AbstractBlock getEmpty(); AbstractBlock getPrison(); AbstractBlock getPark(); }
public class NormalFactory implements AbstractFactory { public AbstractBlock getEmpty() { return new NormalEmpty(); } public AbstractBlock getPrison() { return new NormalPrison(); } public AbstractBlock getPark() { return new NormalPark(); } }
public class MagicFactory implements AbstractFactory { public AbstractBlock getEmpty() { return new MagicEmpty(); } public AbstractBlock getPrison() {return new MagicPrison(); } public AbstractBlock getPark() { return new MagicPark(); } }
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(" "); } } }
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中有哪些工廠模式有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。