解释
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
优点:
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:
产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
列子实现:
模拟场景:
现在汽车品牌千千万...我才不知你要那辆...更不知你喜欢什么颜色的车辆...
UML图:
基础的汽车类:
public interface BaseCar {
/**
* 开车...
*/
void driving();
}
宝马:
public class BMWCar implements BaseCar{
@Override
public void driving() {
System.out.println("BMW开车……");
}
}
奔驰:
public class MercedesCar implements BaseCar{
@Override
public void driving() {
System.out.println("Mercedes开车……");
}
}
基础的颜色类:
public interface BaseColor {
/**
* 填上您爱车的颜色...
*/
void fillColor();
}
red:
public class Red implements BaseColor{
@Override
public void fillColor() {
System.out.println("red....");
}
}
blue:
public class Blue implements BaseColor{
@Override
public void fillColor() {
System.out.println("blue....");
}
}
为 Color 和 Car 对象创建抽象类来获取工厂。
public abstract class AbstractFactory {
/**
* 获取对应颜色
* @param colorName
* @return
*/
public abstract BaseColor getColor(String colorName);
/**
* 获取对应汽车
* @param carName
* @return
*/
public abstract BaseCar getCar(String carName);
}
创建扩展了 AbstractFactory 的工厂类,基于抽象方法生成实体类的对象。
public class CarFactory extends AbstractFactory{
@Override
public BaseColor getColor(String colorName) {
return null;
}
/**
*
* @param carName 汽车品牌名称
* @return 汽车品牌类型
*/
@Override
public BaseCar getCar(String carName){
BaseCar baseCar = null;
try {
baseCar = (BaseCar) Class.forName(carName).newInstance();
} catch (InstantiationException e) {
throw new IllegalArgumentException("无法找到这"+carName+"类car。");
} catch (IllegalAccessException e) {
throw new IllegalArgumentException("无法找到这"+carName+"类car。");
} catch (ClassNotFoundException e) {
throw new IllegalArgumentException("无法找到这"+carName+"类car。");
}
return baseCar;
}
}
public class ColorFactory extends AbstractFactory{
@Override
public BaseColor getColor(String colorName) {
BaseColor baseColor = null;
try {
baseColor = (BaseColor) Class.forName(colorName).newInstance();
} catch (InstantiationException e) {
throw new IllegalArgumentException("无法找到这"+colorName+"颜色呢。");
} catch (IllegalAccessException e) {
throw new IllegalArgumentException("无法找到这"+colorName+"颜色呢。");
} catch (ClassNotFoundException e) {
throw new IllegalArgumentException("无法找到这"+colorName+"颜色呢。");
}
return baseColor;
}
@Override
public BaseCar getCar(String carName) {
return null;
}
}
创建一个生成器类,通过传递标志来获取对应工厂。
public class FactoryProducer {
public static AbstractFactory getFactory(String choice){
switch (choice){
case "car":
return new CarFactory();
case "color":
return new ColorFactory();
default:
throw new IllegalArgumentException("无法找到这"+choice+"的产品..");
}
}
}
测试及其结果:
public class Test {
public static void main(String[] args) {
// 获取汽车工厂
AbstractFactory carFactory = FactoryProducer.getFactory("car");
// 获取对应品牌对象
BaseCar bmw = carFactory.getCar("com.glj.factory.BMWCar");
bmw.driving();
BaseCar mercedes = carFactory.getCar("com.glj.factory.MercedesCar");
mercedes.driving();
// 获取颜色工厂
AbstractFactory colorFactory = FactoryProducer.getFactory("color");
// 获取对应颜色对象
BaseColor redColor = colorFactory.getColor("com.glj.factory.Red");
redColor.fillColor();
BaseColor blueColor = colorFactory.getColor("com.glj.factory.Blue");
blueColor.fillColor();
}
}
------
BMW开车……
Mercedes开车……
red....
blue....