【设计模式】工厂模式之工厂方法模式

  • 定义

        工厂方法模式是指定义一个创建对象的接口,然后实现这个接口的工厂来决定创建什么样的实例。工厂方法让类的实例推迟到子类中进行。在这个模式中,只关心需要创建的是什么工厂,不需要关心创建的细节。而且新加入的产品符合开闭原则。

  • 举例

     1.场景

             有一个支付场景,支付的方式有多种,微信支付,阿里支付,银联支付。如何实现工厂方法模式。

     2.步骤

            (1) 创建支付接口,里面定义抽象的支付方法。

package com.gupao.vip.pay.factorymethod;

public interface IPay {
    void pay();
}

            (2) 创建工厂接口,提供创建的方法,返回支付接口。

package com.gupao.vip.pay.factorymethod;

public interface IPayFactory {
    IPay create();
}

           (3) 创建具体的支付类,AliPay,WechatPay,实现IPay接口,重写支付方法。

package com.gupao.vip.pay.factorymethod;

public class AliPay implements IPay {

    @Override
    public void pay() {
        System.out.println("用支付宝支付");
    }
}
package com.gupao.vip.pay.factorymethod;

public class WechatPay implements IPay {

    @Override
    public void pay() {
        System.out.println("用微信支付");
    }
}

          (4) 创建微信支付和阿里支付的工厂类,继承抽象工厂,重写抽象工厂的create方法,返回具体的支付类

package com.gupao.vip.pay.factorymethod;

public class AliPayFactory implements IPayFactory {

    @Override
    public IPay create() {
        return new AliPay();
    }
}
package com.gupao.vip.pay.factorymethod;

public class WechatPayFactory implements IPayFactory {
    
    @Override
    public IPay create() {
        return new WechatPay();
    }
}

           (5) 在客服端创建所需要的阿里支付和微信支付的工厂,然后由工厂来创建具体的支付类,然后就可以调用各自的支付方法了。

package com.gupao.vip.pay.factorymethod;

public class Test {

    public static void main(String[] args) {
        IPayFactory aliPayFactory = new AliPayFactory();
        IPay aliPay = aliPayFactory.create();
        aliPay.pay();

        IPayFactory wechatPayFactory = new WechatPayFactory();
        IPay wwechatPay = wechatPayFactory.create();
        wwechatPay.pay();

        IPayFactory uniPayFactory = new UniPayFactory();
        IPay uniPay = uniPayFactory.create();
        uniPay.pay();
    }
}
  • 总结

         工厂方法模式只要解决了产品的扩展问题。在简单工厂中,如果在支付的同时需要加入其他的逻辑,而每个支付的逻辑都不一样,那么这个工厂的职责会变得非常的重。有点像万能工厂,不易于维护。而根据软件设计的单一职责原则,我们可以将工厂的职责拆分开来,专人干专事。阿里支付工厂就用来创建阿里支付,微信支付工厂就用来创建微信支付。

      但同时这种设计模式也有它的缺点。它增加了类的创建个数,提升了系统的复杂度和可理解度。

      所以,工厂方法模式适用的场景是:1.创建对象需要大量重复的代码。2.客服端(应用层)不依赖于产品的实例如何被创建。3.一个类是通过其子类来指定创建对象的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值