工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则
所以,从设计角度考虑,有一定的问题,如何解决?
就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
- 发送者接口
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();
}
}
- 运行结果
小结
该模式的优点:在增加一个功能的场景下,例如新增发微信信息,则只需做一个实现类,实现Sender接口,同时做一个工厂类,实现Provider接口,就完成新功能,无需去改动现有的代码。拓展性较好!