一.简介
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。
学习之前抽象工厂模式之前,最好事先熟悉下工厂方法模式.
工厂方法模式:http://blog.csdn.net/hspingcc/article/details/54695008
抽象工厂模式的出现背景简单的说一下,是由于工厂方法模式设计的时候存在一个问题,类的创建依赖工厂类,也就是说,如果想要拓展程序(比如就上个链接中的工厂方法模式的例子为例,想要增加一个cdnsSend的发送功能),必须对工厂类进行修改(也就是要必须要修改SendFactory类),这违背了闭包原则.
所以,从设计角度考虑,有一定的问题,如何解决?由此就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。看下实现代码更好理解.
二.实现
抽象工厂角色(两者公共接口):
public interface Sender {
public void send();
}
具体工厂角色(两个具体的类):
//QQ发送消息
public class QqSend implements Sender {
@Override
public void send() {
System.out.println("QQ Send something...");
}
}
//微信发送消息
public class WechatSend implements Sender {
@Override
public void send() {
System.out.println("Wechat Send something...");
}
}
//接口,可用于扩展实现
public interface Provider {
public Sender produce();
}
实现上面的接口,实现qq发送的工厂类
public class SendQqFactory implements Provider {
@Override
public Sender produce() {
return new QqSend();
}
}
实现上面的接口,实现Wechat发送的工厂类
public class SendWechatFactory implements Provider {
@Override
public Sender produce() {
return new WechatSend();
}
}
测试:
public static void main(String[] args) {
Provider provider = new SendQqFactory();
Sender sender = provider.produce();
sender.send();
}
三.备注及总结
这个模式相对于工厂方法模式的好处就是,如果你现在想增加一个功能:发送csdn信息,则只需做一个实现类(CSDNSend),实现Sender接口,同时做一个工厂类(SendCSDNFactory),实现Provider接口,就可以了,无需去改动现成的代码。从而避免了违背开闭原则.