【设计模式】工厂模式之抽象工厂模式

Alan 351 2019-04-24

定义

抽象工厂模式是指提供一系列相互依赖或者相关的接口,无需指定他们具体的类。客户端(应用层)不依赖于产品实例如何被创建的细节。强调的是一系列相关的产品对象一起使用创建对象需要大量重复的代码,需要提供一个产品类的库。所以的产品以同样的接口出现,从而使客户端不依赖于具体的实现。

举例

场景

有一个支付场景,要支付宝支付和微信支付,支付宝支付和微信支付都可以聊天,都可以借钱(假设)。

步骤
  1. 创建抽象的聊天和借钱的接口,提供抽象的聊天和借钱的方法。
package com.gupao.vip.pay.abstractfactory;

public interface ITalk {
    void talk();
}
package com.gupao.vip.pay.abstractfactory;

public interface ILend {
    void lend();
}
  1. 创建支付的抽象 工厂类,提供公开的初始化方法,提供抽象的创造聊天和支付的方法,返回值是抽象的聊天和借钱。
package com.gupao.vip.pay.abstractfactory;

public abstract class PayFactory {

    public void init(){
        System.out.println("初始化数据");
    }

    protected abstract ITalk createTalk();

    protected abstract ILend createLend();
}
package com.gupao.vip.pay.abstractfactory;

public class AliPayTalk implements ITalk {

    @Override
    public void talk() {
        System.out.println("支付宝聊天");
    }
}
package com.gupao.vip.pay.abstractfactory;

public class WechatTalk implements ITalk {
    
    @Override
    public void talk() {
        System.out.println("微信可以聊天");
    }
}
package com.gupao.vip.pay.abstractfactory;

public class WechatLend implements ILend {

    @Override
    public void lend() {
        System.out.println("微信可以借钱");
    }
}
  1. 创建阿里支付工厂和微信支付工厂,继承支付工厂接口,实现其抽象的方法。在方法中创建具体的聊天和借钱的实例。
package com.gupao.vip.pay.abstractfactory;

public class AliPayFactory extends PayFactory {
    @Override
    protected ITalk createTalk() {
        super.init();
        return new AliPayTalk();
    }

    @Override
    protected ILend createLend() {
        super.init();
        return new AliPayLend();
    }
}
package com.gupao.vip.pay.abstractfactory;

public class WechatPayFactory extends PayFactory {
    @Override
    protected ITalk createTalk() {
        super.init();
        return new WechatTalk();
    }

    @Override
    protected ILend createLend() {
        super.init();
        return new WechatLend();
    }
}
  1. 在客户端创建支付宝支付和微信支付的工厂,调用工厂的创建聊天和借钱的接口创建具体的聊天和借钱的实例,最后调用聊天和借钱的方法。
package com.gupao.vip.pay.abstractfactory;

public class Test {

    public static void main(String[] args) {
        AliPayFactory aliPayFactory = new AliPayFactory();
        aliPayFactory.createTalk().talk();
        aliPayFactory.createLend().lend();

        System.out.println("---------");

        WechatPayFactory wechatPayFactory = new WechatPayFactory();
        wechatPayFactory.createTalk().talk();
        wechatPayFactory.createLend().lend();
    }
}

总结

不知道大家有没有发现,如果在上面的代码中,需要给阿里支付和微信支付添加额外的功能,则需要改变抽象工厂和具体工厂的代码。这样就违背的软件设计的开闭原则。所以抽象工厂模式也是有缺点的。第一,产品族需要扩展功能很麻烦,需要修改抽象接口的代码。第二,创建的抽象类多,增加了系统的抽象性和理解难度。


# 设计模式