【Java设计模式】简单学抽象工厂模式——你好,微信还是支付宝

目录

 

说明

实现方式

自问自答

其他链接


说明

  • 五大创建型模式之一,其他还有单例模式、原型模式、建造者模式、工厂模式。
  • 抽象工厂模式(Abstract Factory Pattern):定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类
  • 抽象工厂模式可以将简单工厂模式工厂方法模式进行整合。
  • 将工厂抽象成两层,AbsFactory(抽象工厂) 和 具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。

实现方式

还还还是我们的支付宝和微信,这次需要付款码和收款码。那么如何用抽象工厂模式来实现呢?UML类图以及代码:

【Java设计模式】简单学抽象工厂模式——你好,微信还是支付宝_第1张图片

/**
 * 抽象工厂模式(一个工厂可以生产一个产品家族的多种产品,需要能支持多个工厂生产各自产品家族的产品)
 *
 * @author ZRH
 * @version 1.0.0
 * @date 2020/7/27
 */
public class AbstractFactoryTest {

    public static void main(String[] args) {
        AbstractApp app = new AliPay();
        app.generateCollectionQrCode().showQrCode();
        app.generatePaymentQrCode().showQrCode();
        //
        app = new WeChat();
        app.generateCollectionQrCode().showQrCode();
        app.generatePaymentQrCode().showQrCode();

    }

}

/**
 * 一款支付的app(抽象工厂),需要既能生成收款码,又能生成付款码
 * 

* * @author ZRH * @version 1.0.0 * @date 2020/7/20 17:11 */ abstract class AbstractApp { /** * 生成收款码 *

* * @return AbstractQrCode * @author : ZRH * @version : 1.0.0 * @date : 2020-07-21 */ public abstract AbstractQrCode generateCollectionQrCode(); /** * 生成付款码 *

* * @return AbstractQrCode * @author : ZRH * @version : 1.0.0 * @date : 2020-07-21 */ public abstract AbstractQrCode generatePaymentQrCode(); } /** * 支付宝app */ class AliPay extends AbstractApp { /** * 生成支付宝收款码 * * @return AbstractQrCode */ @Override public AbstractQrCode generateCollectionQrCode() { return new AliCollectionQrCode(); } /** * 生成支付宝付款码 * * @return AbstractQrCode */ @Override public AbstractQrCode generatePaymentQrCode() { return new AliPaymentQrCode(); } } /** * 微信app */ class WeChat extends AbstractApp { /** * 生成微信收款码 *

* * @return AbstractQrCode * @author : ZRH * @version : 1.0.0 * @date : 2020-07-21 */ @Override public AbstractQrCode generateCollectionQrCode() { return new WeChatCollectionQrCode(); } /** * 生成微信付款码 *

* * @return AbstractQrCode * @author : ZRH * @version : 1.0.0 * @date : 2020-07-21 */ @Override public AbstractQrCode generatePaymentQrCode() { return new WeChatPaymentQrCode(); } } /** * 二维码(产品族类) *

* * @author ZRH * @version 1.0.0 * @date 2020/7/20 17:13 */ abstract class AbstractQrCode { /** * 显示二维码 */ public abstract void showQrCode(); } /** * 收款码 *

* * @author ZRH * @version 1.0.0 * @date 2020/7/20 17:25 */ abstract class CollectionQrCode extends AbstractQrCode { } /** * 支付宝收款码 *

* * @author ZRH * @version 1.0.0 * @date 2020/7/20 17:26 */ class AliCollectionQrCode extends CollectionQrCode { @Override public void showQrCode() { System.out.println("支付宝收款码"); } } /** * 微信收款码 *

* * @author ZRH * @version 1.0.0 * @date 2020/7/20 17:26 */ class WeChatCollectionQrCode extends CollectionQrCode { @Override public void showQrCode() { System.out.println("微信收款码"); } } /** * 付款码 *

* * @author ZRH * @version 1.0.0 * @date 2020/7/20 17:25 */ abstract class PaymentQrCode extends AbstractQrCode { } /** * 支付宝付款码 *

* * @author ZRH * @version 1.0.0 * @date 2020/7/20 17:27 */ class AliPaymentQrCode extends PaymentQrCode { @Override public void showQrCode() { System.out.println("支付宝付款码"); } } /** * 微信付款码 *

* * @author ZRH * @version 1.0.0 * @date 2020/7/20 17:27 */ class WeChatPaymentQrCode extends PaymentQrCode { @Override public void showQrCode() { System.out.println("微信付款码"); } }

这样就让工厂类既能生成付款码,又能生成收款码。


自问自答

问题:为什么要用工厂,不直接new?
回答:
1. 职责单一。总不能入口就new这个产品,new那个产品。
2. 可重复性。要是new这个产品过程复杂,比如需要设置初始化参数呀什么鬼的,直接放工厂类可重复调用。
3. 可维护性。后期逻辑要改生成产品的过程,我难道要到入口类一行行找生产产品的地方?直接工厂类改。
4. 开放封闭。入口类直接调用,管你怎么实现。

其他链接

 

【Java设计模式】简单学工厂模式

【Java设计模式】简单学抽象工厂模式

【Java设计模式】简单学建造者模式

【Java设计模式】简单学单例模式

【Java设计模式】简单学原型模式

 

 

你可能感兴趣的:(Java设计模式,Java)