抽象工厂模式(Abstract Factory Pattern)
提供一个创建一系列相关依赖对象的接口,而无需指定它们具体的类。
动机
客户仅与抽象类定义的接口交互,而不使用特定的具体类的接口。
适用场景
-
一个系统要独立与它的产品创建,组合和表示时。
-
一个系统要由多个产品系列中的一个来配置时。
-
当你强调一系列相关的产品产品对象的设计以便进行联合使用时。
-
当你提供一个产品库,而只想显示他们的接口而不是实现时。
结构
代码示例:两个外卖公司的性质
//抽象工厂
public abstract class AbstractFactory {
public abstract RideHand createRideHand();
public abstract TakeOut createTakeOut();
}
//骑手
public interface RideHand {
RideHand rideHand();
void show();
}
//外卖
public interface TakeOut {
TakeOut takeOut();
void show();
}
//美团骑手
public class MeituanRideHand implements RideHand {
@Override
public RideHand rideHand() {
return new MeituanRideHand();
}
@Override
public void show() {
System.out.println("美团骑手");
}
}
//美团外卖
public class MeituanTakeOut implements TakeOut{
@Override
public TakeOut takeOut() {
return new MeituanTakeOut();
}
@Override
public void show() {
System.out.println("美团外卖");
}
}
//饿了么骑手
public class ElemeRideHand implements RideHand{
@Override
public RideHand rideHand() {
return new ElemeRideHand();
}
@Override
public void show() {
System.out.println("饿了么骑手");
}
}
//饿了么外卖
public class ElemeTackout implements TakeOut {
@Override
public TakeOut takeOut() {
return new ElemeTackout();
}
@Override
public void show() {
System.out.println("饿了么外卖");
}
}
//饿了么工厂
public class ElemeFactory extends AbstractFactory {
@Override
public RideHand createRideHand() {
return new ElemeRideHand();
}
@Override
public TakeOut createTakeOut() {
return new ElemeTackout();
}
}
//美团工厂
public class MeituanFactory extends AbstractFactory {
@Override
public RideHand createRideHand() {
return new MeituanRideHand();
}
@Override
public TakeOut createTakeOut() {
return new MeituanTakeOut();
}
}
public class Client {
public static void main(String[] args) {
AbstractFactory elemeFactory = new ElemeFactory();
RideHand rideHand = elemeFactory.createRideHand();
TakeOut takeOut = elemeFactory.createTakeOut();
rideHand.show();
takeOut.show();
}
}
:饿了么骑手
:饿了么外卖
总结
抽象工厂和工厂方法很相似,也是一个抽象类基类和多个具体工厂类,但抽象工厂的基类定义了多个虚拟工厂,每个工厂返回一个具体产品。相对工厂方法抽象工厂就像是包装了工厂方法一样,可以加入多个工厂共同协作。
