1. 程式人生 > 實用技巧 >java23種設計模式-建立者模式-抽象工廠模式

java23種設計模式-建立者模式-抽象工廠模式

一、定義

  抽象工廠模式是圍繞一個超級工廠建立其他工廠。該超級工廠又稱為其他工廠的工廠。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。

  在抽象工廠模式中,介面是負責建立一個相關物件的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供物件。

二、優點及缺點

優點:

 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 {
    @Override
    
public 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 void
printShape() { 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、生成不同作業系統的程式。

注意事項:產品族難擴充套件,產品等級易擴充套件。