设计模式(Design Patterns)抽象工厂模式(Abstract Factory)

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则
所以,从设计角度考虑,有一定的问题,如何解决?
就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。

设计模式(Design Patterns)抽象工厂模式(Abstract Factory)_第1张图片
  • 发送者接口
package com.sima.java.abstractfactory;

/**
 * Created by maple on 2017-08-19.
 */
public interface Sender {
    public void send();
}

  • 两个发送者实现类
package com.sima.java.abstractfactory;

/**
 * Created by maple on 2017-08-19.
 */
public class MailSender implements Sender {
    public void send() {
        System.out.println("send Mail!");
    }
}
package com.sima.java.abstractfactory;

/**
 * Created by maple on 2017-08-19.
 */
public class SmsSender implements Sender {
    public void send() {
        System.out.println("send SMS!");
    }
}
  • 工厂抽象类
package com.sima.java.abstractfactory;

/**
 * Created by maple on 2017-08-20.
 */
public abstract class AbstractProvider {
    public abstract Sender abstractProduce();
}
  • 两个工厂实现类
package com.sima.java.abstractfactory;

/**
 * Created by maple on 2017-08-20.
 */
public class AbstractSendMailFactory extends AbstractProvider{
    public Sender abstractProduce() {
        return new MailSender();
    }
}
package com.sima.java.abstractfactory;

/**
 * Created by maple on 2017-08-20.
 */
public class AbstractSmsMailFactory extends AbstractProvider{
    public Sender abstractProduce() {
        return new SmsSender();
    }
}
  • 测试
package com.sima.java;

import com.sima.java.abstractfactory.AbstractProvider;
import com.sima.java.abstractfactory.AbstractSendMailFactory;
import com.sima.java.abstractfactory.Provider;
import com.sima.java.abstractfactory.SendMailFactory;
import com.sima.java.factorymethod.SendFactory;
import com.sima.java.factorymethod.SendFactoryMore;
import com.sima.java.factorymethod.SendFactoryMoreStatic;
import com.sima.java.factorymethod.Sender;

public class App
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
        AbstractProvider abstractProvider = new AbstractSendMailFactory();
        com.sima.java.abstractfactory.Sender sender = abstractProvider.abstractProduce();
        sender.send();
    }
}
  • 运行结果
设计模式(Design Patterns)抽象工厂模式(Abstract Factory)_第2张图片

小结

该模式的优点:在增加一个功能的场景下,例如新增发微信信息,则只需做一个实现类,实现Sender接口,同时做一个工厂类,实现Provider接口,就完成新功能,无需去改动现有的代码。拓展性较好!

你可能感兴趣的:(设计模式(Design Patterns)抽象工厂模式(Abstract Factory))