java23種設計模式-建立者模式-抽象工廠模式
阿新 • • 發佈:2020-09-21
一、定義
抽象工廠模式是圍繞一個超級工廠建立其他工廠。該超級工廠又稱為其他工廠的工廠。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。
在抽象工廠模式中,介面是負責建立一個相關物件的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供物件。
二、優點及缺點
優點:
1、當一個產品族中的多個物件被設計成一起工作時,它能保證客戶端始終只使用同一個產品族中的物件。
缺點:
2、產品族擴充套件非常困難,要增加一個系列的某一產品,既要在抽象的 Creator 里加程式碼,又要在具體的裡面加程式碼。
三、程式碼實現:
水果抽象類:
/** * @author: wsq * @Date: 2020/9/18 14:38 * @Description: 水果介面 */ public interface Fruit { public void printName(); }
水果的兩個實現類:
public class Apple implements Fruit { @Override public void printName() { System.out.println("This is apple!!!"); } } public class Banana implements Fruit { @Overridepublic void printName() { System.out.println("This is banana!!!"); } }
圖形抽象類:
/** * @author: wsq * @Date: 2020/9/21 19:17 * @Description: 圖形抽象類 */ public interface Shape { public void printShape(); }
圖形的兩個實現類:
public class Square implements Shape{ @Override public voidprintShape() { System.out.println("This is square!!!"); } } public class Circle implements Shape{ @Override public void printShape() { System.out.println("This is circle!!!"); } }
圖形和水果的抽象工廠類:
/** * @author: wsq * @Date: 2020/9/18 15:00 * @Description: 抽象工廠 */ public abstract class AbstactFactory { public abstract Shape getShape(String name); public abstract Fruit getFruit(String name); }
圖形和水果的工廠類:
/** * @author: wsq * @Date: 2020/9/21 19:19 * @Description: 水果的工廠 */ public class FruitFactory extends AbstactFactory{ @Override public Shape getShape(String name) { return null; } public Fruit getFruit(String name){ if(name.equals("apple")){ return new Apple(); } if(name.equals("banana")){ return new Banana(); } return null; } } /** * @author: wsq * @Date: 14:57 * @Description: 圖形的工廠 */ public class ShapeFactory extends AbstactFactory{ public Shape getShape(String name){ if(name.equals("circle")){ return new Circle(); }else if(name.equals("square")){ return new Square(); } return null; } @Override public Fruit getFruit(String name) { return null; } }
工廠類:
/** * @author: wsq * @Date: 2020/9/21 19:20 * @Description: 工廠類 */ public class FactoryProducer { public AbstactFactory getFactory(String name){ if(name.equals("FruitFactory")){ return new FruitFactory(); }else if(name.equals("shapeFactory")){ return new ShapeFactory(); } return null; } }
四、原始碼級別
五、總結
使用場景:
1、一組資料,一換就換一套。
2、生成不同作業系統的程式。
注意事項:產品族難擴充套件,產品等級易擴充套件。