一、定義
抽象工廠模式是利用一個超級工廠來創建其他工廠。該設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。
在抽象工廠模式中,接口是負責創建一個生成別的對象的工廠,而不是生產指定的類。每個生成對象的工廠都按照工廠模式提供對象。
二、詳細介紹
- 意圖:提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
- 解決問題:主要解決接口選擇的問題。
- 使用場景:系統的產品有多於一個的產品族,而系統只消費其中某一族的產品。
- 解決方式:在一個產品族裏面,定義多個產品。
- 優點:當一個產品族中的多個對象被設計成一起工作時,它能保證客戶端始終只使用同一個產品族中的對象。
- 缺點:產品族擴展非常困難,要增加一個系列的某一產品,既要在抽象的 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、更多內容