- 工厂模式有 3 种不同的实现方式
- 简单工厂模式:通过传入相关的类型来返回相应的类,这种方式比较单 一,可扩展性相对较差;
- 工厂方法模式:通过实现类实现相应的方法来决定相应的返回结果,这种方式的可扩展性比较强;
- 抽象工厂模式:基于上述两种模式的拓展,是工厂方法模式的升级版,当需要创建的产品有多个产品线时使用抽象工厂模式是比较好的选择
- 抽象工厂模式在 Spring 中应用得最为广泛的一种设计模式
- 背景
- 工厂方法模式引入工厂等级结构,解决了简单工厂模式中工厂类职责过重的问题
- 但工厂方法模式中每个工厂只创建一类具体类的对象,后续发展可能会导致工厂类过多,因此将一些相关的具体类组成一个“具体类族”,由同一个工厂来统一生产,强调的是一系列相关的产品对象!!!
- 防止有干扰,注释掉原先的类
小例子来了——先看结构图
public class Main { public static void main(String[] args) { OrderFactory orderFactory = FactoryProducer.getFactory("ALI"); assert orderFactory != null; orderFactory.createPay().unifiedorder(); orderFactory.createRefund().refund(); } }
public class FactoryProducer { public static OrderFactory getFactory(String type) { if (type.equalsIgnoreCase("WECHAT")) { return new WechatOrderFactory(); } else if (type.equalsIgnoreCase("ALI")) { return new AliOrderFactory(); } return null; } }
public interface OrderFactory { PayFactory createPay(); RefundFactory createRefund(); }
public interface PayFactory { /** * 统一下单 */ void unifiedorder(); }
/** * 退款抽象接口 */ public interface RefundFactory { /** * 退款 */ void refund(); }
public class AliOrderFactory implements OrderFactory { @Override public PayFactory createPay() { return new AliPay(); } @Override public RefundFactory createRefund() { return new AliRefund(); } }
public class AliPay implements PayFactory { @Override public void unifiedorder() { System.out.println("支付宝支付 统一下单接口"); } }
public class AliRefund implements RefundFactory { @Override public void refund() { System.out.println("支付宝 退款"); } }
public class WechatOrderFactory implements OrderFactory { @Override public PayFactory createPay() { return new WechatPay(); } @Override public RefundFactory createRefund() { return new WechatRefund(); } }
public class WechatPay implements PayFactory { @Override public void unifiedorder() { System.out.println("微信支付支付 统一下单接口"); } }
public class WechatRefund implements RefundFactory { @Override public void refund() { System.out.println("微信支付 退款"); } }
- 工厂方法模式和抽象工厂方法模式
- 当抽象工厂模式中每一个具体工厂类只创建一个产品对象,抽象工厂模式退化成工厂方法模式
- 优点
- 当一个产品族中的多个对象被设计成一起工作时,它能保证使用方始终只使用同一个产品族中的对象
- 产品等级结构扩展容易,如果需要增加多一个产品等级,只需要增加新的工厂类和产品类即可, 比如增加银行支付、退款
- 缺点
- 产品族扩展困难,要增加一个系列的某一产品,既要在抽象的工厂和抽象产品里修改代码,不是很符合开闭原则
- 增加了系统的抽象性和理解难度
本文作者为DBC,转载请注明。