設計模式初級:03-抽象工廠模式

一、定義

    抽象工廠模式是利用一個超級工廠來創建其他工廠。該設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。

    在抽象工廠模式中,接口是負責創建一個生成別的對象的工廠,而不是生產指定的類。每個生成對象的工廠都按照工廠模式提供對象。

二、詳細介紹

  • 意圖:提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
  • 解決問題:主要解決接口選擇的問題。
  • 使用場景:系統的產品有多於一個的產品族,而系統只消費其中某一族的產品。
  • 解決方式:在一個產品族裏面,定義多個產品。
  • 優點:當一個產品族中的多個對象被設計成一起工作時,它能保證客戶端始終只使用同一個產品族中的對象。
  • 缺點:產品族擴展非常困難,要增加一個系列的某一產品,既要在抽象的 Creator 里加代碼,又要在具體的裏面加代碼。
  • 應用實例:1、QQ 換皮膚,一整套一起換。 2、生成不同操作系統的程序。

三、實現

1、創建繪製形狀的接口

/**
 * desc: 創建形狀的接口
 * author: [email protected]
 * date: 2020/01/20
 */
public interface Shape {
    public void draw();
}

2、創建實現繪製形狀接口的實現類

/**
 * desc: 畫圓實體類
 * @Author guodandan
 * @Date 2020/1/18 16:58
 */
public class Circle implements Shape {
    public void draw() {
        System.out.println(":::::::: draw() ::: Circle");
    }
}

/**
 * desc: 畫方實體類
 * @Author guodandan
 * @Date 2020/1/18 16:56
 */
public class Rectangle implements Shape {
    public void draw() {
        System.out.println(":::::::: draw() :: Rectangle");
    }
}

3、創建設置顏色的接口

/**
 * desc: 設置顏色接口
 * author: [email protected]
 * date: 2020/01/25
 */
public interface Color {
    public void show();
}

4、創建設置不同顏色的實現類

/**
 * desc: 設置顏色爲紅色
 * author: [email protected]
 * date: 2020/01/25
 */
public class Red implements Color {
    @Override
    public void show() {
        System.out.println(":::::::: show() :: red");
    }
}

/**
 * desc: 設置顏色爲綠色
 * author: [email protected]
 * date: 2020/01/25
 */
public class Green implements Color {
    @Override
    public void show() {
        System.out.println(":::::::: show() :: green");
    }
}

5、爲 Color 和 Shape 對象創建抽象類來獲取工廠

/**
 * desc: 抽象工廠
 * author: [email protected]
 * date: 2020/01/20
 */
public abstract class AbstractFactory {

    public abstract Color getColor(Class<? extends Color> clazz);

    public abstract Shape getShape(Class<? extends Shape> clazz);

}

6、創建擴展了 AbstractFactory 的工廠類,基於給定的信息生成實體類的對象

/**
 * desc: 抽象工廠實現類,實現顏色工廠對象的創建
 * author: [email protected]
 * date: 2020/01/25
 */
public class ColorFactory extends AbstractFactory {

    @Override
    public Color getColor(Class<? extends Color> clazz) {
        try {
            return clazz.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 通過反射,利用工廠模式實現目標實現類。
     * 優點: 每次增加新的實例對象,不需要修改工廠方法,擴展性好
     * @param clazz 目標類class
     * @return 目標類
     */
    @Override
    public Shape getShape(Class<? extends Shape> clazz) {
        return null;
    }
}

package net.cxyk.ch02_asbFactory;

/**
 * desc: 抽象工廠實現類,實現畫圖工廠對象的創建
 * author: [email protected]
 * date: 2020/01/25
 */
public class ShapeFactory extends AbstractFactory {

    @Override
    public Color getColor(Class<? extends Color> clazz) {
        return null;
    }

    /**
     * 通過反射,利用工廠模式實現目標實現類。
     * 優點: 每次增加新的實例對象,不需要修改工廠方法,擴展性好
     * @param clazz 目標類class
     * @return 目標類
     */
    @Override
    public Shape getShape(Class<? extends Shape> clazz) {
        try {
            return clazz.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }
}

7、創建一個工廠創造器/生成器類,通過傳遞形狀或顏色信息來獲取工廠

/**
 * desc: 創建一個工廠創造器/生成器類,通過傳遞形狀或顏色信息來獲取工廠。
 * author: [email protected]
 * date: 2020/01/26
 */
public class FactoryProducer {
    public static AbstractFactory getFactory(Class<? extends AbstractFactory> clazz){
        try {
            return clazz.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }
}

8、測試類

import org.junit.Test;

/**
 * desc:
 * author: [email protected]
 * date: 2020/01/26
 */
public class TestAbstractFactory {
    @Test
    public void test(){

        // 1、利用抽象工廠對象創建畫圖工廠對象
        AbstractFactory shapeFactory = FactoryProducer.getFactory(ShapeFactory.class);
        // 2、利用畫圖工廠對象創建畫圓對象,並使用調用畫圖方法
        Shape shape = shapeFactory.getShape(Circle.class);
        shape.draw();;
        // 3、利用畫圖工廠對象創建畫方對象,並使用調用畫圖方法
        shape = shapeFactory.getShape(Rectangle.class);
        shape.draw();
        // 4、利用抽象工廠對象創建顏色工廠對象
        AbstractFactory colorFactory = FactoryProducer.getFactory(ColorFactory.class);
        // 5、利用顏色工廠對象創建畫紅色對象,並調用方法設置顏色。
        Color color = colorFactory.getColor(Red.class);
        color.show();
        // 6、利用顏色工廠對象創建畫綠色對象,並調用方法設置顏色。
        color = colorFactory.getColor(Green.class);
        color.show();
    }
}

9、測試結果

:::::::: draw() ::: Circle
:::::::: draw() :: Rectangle
:::::::: show() :: red
:::::::: show() :: green

10、更多內容

標題
發佈了34 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章