2.抽象工厂模式
核心:基于不同的类型选择产品工厂,进而根据条件选择不同的产品
优点:当一个产品族中的多个对象被一起使用,协同工作时,抽象工厂模式能够保证使用的都是同一个产品族的对象(为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。)
缺点:产品族(产品类factory)扩展困难,需要在抽象工厂中增加代码,工厂创建者中增加代码
例如以微信支付和支付宝支付为例,不同的支付方式需要对应不同的支付密码,抽象工厂模式适合这种同一个产品族(例如:微信支付和微信密码是一个产品族)的协同工作
- 创建支付方式的接口PayWay,并实现两个实现类AliPay和WechatPay,并实现pay方法
- 创建密码接口Password,并实现两个实现类AliPwd和WechatPwd,并实现pwd方法
- 以上两步定义了两种产品和具体实现。接着实现一个总的抽象工厂abstractFactory,这个抽象工厂中有两个抽象方法getway和getpwd(其实就是获取产品的方法)
- 继承abstractFactory分别实现PwdFactory和WayFactory,并相应的重写getway和getpwd方法。这样就完成了抽象工厂的定义,其本质还是根据不同的条件去获取不同的产品,抽象工厂abstractFactory只是对各种类产品进行了一般化抽象,具体的产品选择代码还是在相应的产品工厂实现类中。
- 创建一个FactoryProducer,根据不同的type去创建PwdFactory或WayFactory。
- 以上就完成了产品、抽象产品、产品工厂、抽象工厂和工厂创建者的工作,接着就可以由使用者使用了。
private static String type = "wechat";
public static void main(String[] args) {
AbstractFactory way = FactoryProducer.getFactory("way");
PayWay alipay = way.getway(type);
alipay.pay();
AbstractFactory pwd = FactoryProducer.getFactory("pwd");
Password alipwd = pwd.getpwd(type);
alipwd.pwd();
}