创建型-工厂模式(Factory Pattern)

开课吧格桑2021-12-02 15:43

  本篇我们来学习工厂模式,有的小伙伴可能会说起航篇里的大纲中没有这个模式呀,这是从哪冒出来的。事实确实如此,工厂模式包含了简单工厂模式、工厂方法模式和抽象工厂模式。

  简单工厂模式也没有在大纲中出现,这个是较早出现的工厂模式。

  什么是工厂模式

  大白话来说就是,当我们需要一个对象时,不需要知道具体的创建过程,只需要问工厂要即可。由此可见,工厂的作用就是为我们创建对象。

  举个栗子,比如你要去买书,可能想买《Java编程思想》,也可能是《Effective Java》又或者是《深入理解Java虚拟机》,这种情况下直接去书店就能满足你的需求。这里的书店就充当工厂的作用。

  简单工厂(Simple Factory)

  简单工厂模式也叫静态工厂方法,根据传入的参数不同返回相应的对象。实现该方法所在的类就是简单工厂类。如下图所示:

创建型-工厂模式(Factory Pattern)

  这里以支付为例,日常生活中大家在付款时,用的比较多的就是支付宝和微信了。根据这个场景我们来实现简单工厂的代码。

  第一步:创建支付接口

/**
 * 第一步:创建抽象产品接口,定义抽象方法,让具体的产品类去实现具体业务
 */
public interface IPay {

    /**
     * 定义统一支付方法
     */
    void unifiedorder();
}

  第二步:创建具体的业务实现

/**
 * 第二步:创建具体产品类,实现抽象产品接口,并实现具体的业务方法
 */
public class AliPay implements IPay {

    @Override
    public void unifiedorder() {
        System.out.println("调用阿里支付");
    }
}

/**
 * 第二步:创建具体产品类,实现抽象产品接口,并实现具体的业务方法
 */
public class WechatPay implements IPay{

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

  第三步:创建简单工厂

/**
 * 第三步:创建简单工厂类,负责创建用户所需的对象
 */
public class SimplePayFactory {

    /**
     * 获取支付对象方法
     * @param beanName
     * @return
     */
    public static IPay getPayInstance(String beanName) {
        if (beanName.equalsIgnoreCase("AliPay")) {
            return new AliPay();
        } else if (beanName.equalsIgnoreCase("WechatPay")) {
            return new WechatPay();
        } else {
            return null;
        }
    }
}

  第四步:测试

public class SimpleFactoryTest {

    public static void main(String[] args) {
        IPay aliPay = SimplePayFactory.getPayInstance("AliPay");
        aliPay.unifiedorder();
        IPay wechatPay = SimplePayFactory.getPayInstance("WechatPay");
        wechatPay.unifiedorder();
    }
}

  运行结果:

调用阿里支付
调用微信支付

  优点:解耦

  缺点:

  违背开闭原则,新增Product类需要修改 getPayInstance 代码

  一定程度上增加了类的数量

  不利于系统的维护和扩展

  工厂方法(Factory Method)

  工厂方法模式又称工厂模式,是简单工厂的一个变种,解决了开闭原则问题。用户只需要知道具体工厂的名称就可以拿到相应的对象。如下图所示: