1、抽象工厂模式
简单工厂模式存在的问题:
类实例的创建依赖工厂类,也就是说,如果想拓展程序,必须对工厂类进行修改,这违背了闭包原则。
那如何解决呢??
通过抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
关键点是:通过抽象工厂类创建多个工厂类。(产品通过工厂类来生成,而生成产品的对应的工厂类通过抽象类来生成:一个工厂类对应一种具体的产品)
实例一:
产品类
public interface Sender {
public void send();
}
public class MailSender implements Sender {
@Override
public void send() {
System.out.println(" ~~~ MailSender ~~~~");
}
}
public class SmsSender implements Sender {
@Override
public void send() {
System.out.println(" ~~~~ SmsSender ~~~");
}
}
定义抽象工厂,以及根据产品创建的对应的工厂类
public interface AbstractFactory {
public Sender producter();
}
public class MailSenderFactory implements AbstractFactory {
@Override
public Sender producter() {
return new MailSender();
}
}
public class SmsSenderFactory implements AbstractFactory {
@Override
public Sender producter() {
return new SmsSender();
}
}
模拟使用:
public static void main(final String[] args) {
final AbstractFactory factory = new MailSenderFactory();
factory.producter().send();
final AbstractFactory factory2 = new SmsSenderFactory();
factory2.producter().send();
}
如果此时需要拓展一个发送word文档的类,则不必修改已有代码,直接对其进行新增对应的工厂即可
// 新增的工作簿发送产品
public class WordSender implements Sender {
@Override
public void send() {
System.out.println(" ~~~~ WordSender ~~~~");
}
}
// 新增对应的创建工厂
public class WordSenderFactory implements AbstractFactory {
@Override
public Sender producter() {
return new WordSender();
}
}
public static void main(final String[] args) {
final AbstractFactory factory = new MailSenderFactory();
factory.producter().send();
final AbstractFactory factory2 = new SmsSenderFactory();
factory2.producter().send();
// 模拟使用
final AbstractFactory factory3 = new WordSenderFactory();
factory3.producter().send();
}