工厂设计模式实践指南- 抽象工厂方法模式

DBC 665 0
  • 工厂模式有 3 种不同的实现方式
    • 简单工厂模式:通过传入相关的类型来返回相应的类,这种方式比较单 一,可扩展性相对较差;
    • 工厂方法模式:通过实现类实现相应的方法来决定相应的返回结果,这种方式的可扩展性比较强;
    • 抽象工厂模式:基于上述两种模式的拓展,是工厂方法模式的升级版,当需要创建的产品有多个产品线时使用抽象工厂模式是比较好的选择
    • 抽象工厂模式在 Spring 中应用得最为广泛的一种设计模式

 

  • 背景
    • 工厂方法模式引入工厂等级结构,解决了简单工厂模式中工厂类职责过重的问题
    • 但工厂方法模式中每个工厂只创建一类具体类的对象,后续发展可能会导致工厂类过多,因此将一些相关的具体类组成一个“具体类族”,由同一个工厂来统一生产,强调的是一系列相关的产品对象!!!

工厂设计模式实践指南- 抽象工厂方法模式插图

实现步骤

1、定义两个接口 Pay、Refund

2、创建具体的Pay产品、创建具体的Refund产品

3、创建抽象工厂 OrderFactory 接口
里面两个方法 createPay/createRefund

4、创建支付宝产品族AliOderFactory,实现OrderFactory抽象工厂

5、创建微信支付产品族WechatOderFactory,实现OrderFactory抽象工厂

6、定义一个超级工厂创造器,通过传递参数获取对应的工厂

工厂设计模式实践指南- 抽象工厂方法模式插图2

  • 防止有干扰,注释掉原先的类

小例子来了——先看结构图

工厂设计模式实践指南- 抽象工厂方法模式插图4

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("微信支付 退款");
    }
}
  • 工厂方法模式和抽象工厂方法模式
    • 当抽象工厂模式中每一个具体工厂类只创建一个产品对象,抽象工厂模式退化成工厂方法模式

     

  • 优点
    • 当一个产品族中的多个对象被设计成一起工作时,它能保证使用方始终只使用同一个产品族中的对象
    • 产品等级结构扩展容易,如果需要增加多一个产品等级,只需要增加新的工厂类和产品类即可, 比如增加银行支付、退款
  • 缺点
    • 产品族扩展困难,要增加一个系列的某一产品,既要在抽象的工厂和抽象产品里修改代码,不是很符合开闭原则
    • 增加了系统的抽象性和理解难度

发表评论 取消回复
表情 图片 链接 代码

分享