抽象工廠模式(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)步驟:
- 創(chuàng)建一個(gè)形狀接口
/**
* 1. 創(chuàng)建一個(gè)形狀接口
* @author mazaiting
*/
public interface Shape {
/**
* 畫圖方法
*/
void draw();
}
- 創(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("圓形");
}
}
- 創(chuàng)建一個(gè)顏色接口
/**
* 3. 創(chuàng)建顏色接口
* @author mazaiting
*/
public interface Color {
/**
* 填充顏色
*/
void fill();
}
- 創(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("紅色");
}
}
- 為顏色和形狀創(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);
}
- 創(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;
}
}
- 創(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;
}
}
- 主函數(shù)
public class Client {
public static void main(String[] args) {
// 獲取具體的工廠
AbstractFactory factory = FactoryProducer.getFactory(AbstractFactory.COLORFACTORY);
// 獲取具體的顏色類
Color color = factory.getColor(AbstractFactory.BLUE);
// 填充顏色
color.fill();
}
}