Java Abstract Factory Pattern(抽象工廠模式)

抽象工廠模式(Abstract Factory Pattern)是圍繞一個(gè)超級(jí)工廠創(chuàng)建其他工廠。該超級(jí)工廠又稱為其他工廠的工廠。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。
在抽象工廠模式中,接口是負(fù)責(zé)創(chuàng)建一個(gè)相關(guān)對(duì)象的工廠,不需要顯式指定它們的類。每個(gè)生成的工廠都能按照工廠模式提供對(duì)象。

優(yōu)點(diǎn):當(dāng)一個(gè)產(chǎn)品族中的多個(gè)對(duì)象被設(shè)計(jì)成一起工作時(shí),它能保證客戶端始終只使用同一個(gè)產(chǎn)品族中的對(duì)象。
缺點(diǎn):產(chǎn)品族擴(kuò)展非常困難,要增加一個(gè)系列的某一產(chǎn)品,既要在抽象的 Creator 里加代碼,又要在具體的里面加代碼。

實(shí)現(xiàn)步驟:

  1. 創(chuàng)建一個(gè)形狀接口
/**
 * 1. 創(chuàng)建一個(gè)形狀接口
 * @author mazaiting
 */
public interface Shape {
    /**
     * 畫圖方法
     */
    void draw();
}
  1. 創(chuàng)建實(shí)現(xiàn)接口的實(shí)現(xiàn)類
/**
 * 2. 創(chuàng)建實(shí)現(xiàn)接口的實(shí)現(xiàn)類--矩形
 * @author mazaiting
 */
public class Square implements Shape{

    public void draw() {
        System.out.println("矩形");
    }

}

/**
 * 2. 創(chuàng)建實(shí)現(xiàn)接口的實(shí)現(xiàn)類--圓角矩形
 * @author mazaiting
 */
public class Rectangle implements Shape{

    public void draw() {
        System.out.println("圓角矩形");
    }

}

/**
 * 2. 創(chuàng)建實(shí)現(xiàn)接口的實(shí)現(xiàn)類--圓形
 * @author mazaiting
 */
public class Circle implements Shape{

    public void draw() {
        System.out.println("圓形");
    }

}
  1. 創(chuàng)建一個(gè)顏色接口
/**
 * 3. 創(chuàng)建顏色接口
 * @author mazaiting
 */
public interface Color {
    /**
     * 填充顏色
     */
    void fill();
}
  1. 創(chuàng)建實(shí)現(xiàn)顏色接口的實(shí)體類
/**
 * 4. 創(chuàng)建實(shí)現(xiàn)顏色接口的實(shí)體類--藍(lán)色
 * @author mazaiting
 */
public class Blue implements Color{

    public void fill() {
        System.out.println("藍(lán)色");
    }

}

/**
 * 4. 創(chuàng)建實(shí)現(xiàn)顏色接口的實(shí)體類--綠色
 * @author mazaiting
 */
public class Green implements Color{

    public void fill() {
        System.out.println("綠色");
    }

}

/**
 * 4. 創(chuàng)建實(shí)現(xiàn)顏色接口的實(shí)體類--紅色
 * @author mazaiting
 */
public class Red implements Color{

    public void fill() {
        System.out.println("紅色");
    }

}
  1. 為顏色和形狀創(chuàng)建抽象類
/**
 * 5. 為顏色和形狀創(chuàng)建抽象類來獲取工廠
 * @author mazaiting
 */
public abstract class AbstractFactory {
    /**形狀工廠類(包名+類名)--com.mazaiting.factory.ShapeFactory*/
    public static final String SHAPEFACTORY = ShapeFactory.class.getName();
    /**顏色工廠類(包名+類名)--com.mazaiting.factory.ColorFactory*/
    public static final String COLORFACTORY = ColorFactory.class.getName();
    
    /**圓角矩形類名稱(包名+類名)--com.mazaiting.shape.Rectangle*/
    public static final String RECTANGLE = Rectangle.class.getName();
    /**矩形類名稱(包名+類名)--com.mazaiting.shape.Square*/
    public static final String SQUARE = Square.class.getName();
    /**圓形類名稱(包名+類名)--com.mazaiting.shape.Circle*/
    public static final String CIRCLE = Circle.class.getName();
    /**紅色類名稱(包名+類名)--com.mazaiting.color.Red*/
    public static final String RED = Red.class.getName();
    /**綠色類名稱(包名+類名)--com.mazaiting.color.Green*/
    public static final String GREEN = Green.class.getName();
    /**藍(lán)色類名稱(包名+類名)--com.mazaiting.color.Blue*/
    public static final String BLUE = Blue.class.getName();
    
    public abstract Color getColor(String color);
    public abstract Shape getShape(String shape);
}
  1. 創(chuàng)建擴(kuò)展了 AbstractFactory 的工廠類,基于給定的信息生成實(shí)體類的對(duì)象。
/**
 * 6. 創(chuàng)建擴(kuò)展了 AbstractFactory 的工廠類,基于給定的信息生成實(shí)體類的對(duì)象。
 * @author mazaiting
 */
public class ShapeFactory extends AbstractFactory{
    
    /**
     * 單例。如有不懂,請(qǐng)移步 單例模式(http://www.lxweimin.com/p/fb952d0140ec)
     */
    private static ShapeFactory sShapeFactory; 
    private ShapeFactory(){}
    public static ShapeFactory getInstace() {
        if (null == sShapeFactory) {
            synchronized (ShapeFactory.class) {
                if (null == sShapeFactory) {
                    sShapeFactory = new ShapeFactory();
                }
            }
        }
        return sShapeFactory;
    }
    
    /**
     * 獲取形狀類型對(duì)象
     * 使用反射創(chuàng)建具體類的實(shí)例。如有不懂,請(qǐng)移步 反射機(jī)制詳解(http://www.lxweimin.com/p/990910bd600e)
     * @param type 類型
     * @return 返回形狀類型對(duì)象
     */
    @Override
    public Shape getShape(String shape) {
        try {
            Class<?> clazz = Class.forName(shape);
            return (Shape) clazz.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    @Override
    public Color getColor(String color) {
        return null;
    }
    
}


/**
 * 6. 創(chuàng)建擴(kuò)展了 AbstractFactory 的工廠類,基于給定的信息生成實(shí)體類的對(duì)象。
 * @author mazaiting
 */
public class ColorFactory extends AbstractFactory{
    
    /**
     * 單例。如有不懂,請(qǐng)移步 單例模式(http://www.lxweimin.com/p/fb952d0140ec)
     */
    private static ColorFactory sColorFactory; 
    private ColorFactory(){}
    public static ColorFactory getInstace() {
        if (null == sColorFactory) {
            synchronized (ColorFactory.class) {
                if (null == sColorFactory) {
                    sColorFactory = new ColorFactory();
                }
            }
        }
        return sColorFactory;
    }
    
    @Override
    public Shape getShape(String shape) {
        return null;
    }
    
    /**
     * 獲取形狀類型對(duì)象
     * 使用反射創(chuàng)建具體類的實(shí)例。如有不懂,請(qǐng)移步 反射機(jī)制詳解(http://www.lxweimin.com/p/990910bd600e)
     * @param type 類型
     * @return 返回形狀類型對(duì)象
     */
    @Override
    public Color getColor(String color) {
        try {
            Class<?> clazz = Class.forName(color);
            return (Color) clazz.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
}
  1. 創(chuàng)建一個(gè)工廠創(chuàng)造器/生成器類,通過傳遞形狀或顏色信息來獲取工廠。
/**
 * 7. 創(chuàng)建一個(gè)工廠創(chuàng)造器/生成器類,通過傳遞形狀或顏色信息來獲取工廠。
 * @author mazaiting
 */
public class FactoryProducer {
    
    private static AbstractFactory abstractFactory = null;

    public static AbstractFactory getFactory(String factory) {
        if (null == factory) {
            throw new RuntimeException("Param can't null");
        }

        if (factory.equalsIgnoreCase(AbstractFactory.SHAPEFACTORY)) {
            // 獲取形狀工廠實(shí)例
            abstractFactory = ShapeFactory.getInstace();
        } else if (factory.equalsIgnoreCase(AbstractFactory.COLORFACTORY)) {
            // 獲取顏色工廠實(shí)例
            abstractFactory = ColorFactory.getInstace();
        }
        return abstractFactory;
    }
    
}   
  1. 主函數(shù)
public class Client {
    public static void main(String[] args) {
        // 獲取具體的工廠
        AbstractFactory factory = FactoryProducer.getFactory(AbstractFactory.COLORFACTORY);
        // 獲取具體的顏色類
        Color color = factory.getColor(AbstractFactory.BLUE);
        // 填充顏色
        color.fill();
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 工廠方法模式通過引入工廠等級(jí)結(jié)構(gòu),解決了簡(jiǎn)單工廠模式中工廠類職責(zé)太重的問題,但由于工廠方法模式中的每個(gè)工廠只生產(chǎn)一...
    justCode_閱讀 1,218評(píng)論 1 6
  • 設(shè)計(jì)模式匯總 一、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 3,982評(píng)論 1 15
  • 1 場(chǎng)景問題# 1.1 選擇組裝電腦的配件## 舉個(gè)生活中常見的例子——組裝電腦,我們?cè)诮M裝電腦的時(shí)候,通常需要選...
    七寸知架構(gòu)閱讀 4,419評(píng)論 6 67
  • 一、工廠模式介紹 工廠模式專門負(fù)責(zé)將大量有共同接口的類實(shí)例化。工廠模式可以動(dòng)態(tài)決定將哪一個(gè)類實(shí)例化,不必事先知道每...
    端木軒閱讀 12,759評(píng)論 1 20
  • 不要再浪費(fèi)我 一弦一柱彼此消磨 不要再珍惜我 執(zhí)著如斯業(yè)已淪落 沉默 沉沒 裝作沒有瘋魔 結(jié)果 結(jié)果 費(fèi)勁心機(jī)快活...
    格文夕閱讀 219評(píng)論 0 2