抽象工厂模式(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(); }}
:饿了么骑手:饿了么外卖
总结:
抽象工厂和工厂方法很相似,也是一个抽象类基类和多个具体工厂类,但抽象工厂的基类定义了多个虚拟工厂,每个工厂返回一个具体产品。相对工厂方法抽象工厂就像是包装了工厂方法一样,可以加入多个工厂共同协作。
原文:https://www.cnblogs.com/dhcq/p/12997422.html