前面一篇文章分析到工厂方法模式(3种类型模式),今天有空就倒腾一番抽象工厂模式。前面的工厂模式对我们原有的代码侵入性太强,不利于我们后期对原有功能的扩展,这也违背了Java设计模式的六大原则之一开闭原则。(Java设计模式六大原则:开闭原则、里氏代换原则、依赖倒转原则、接口隔离、迪米特法则、单一职责原则)。抽象工厂模式就恰好规避了侵入性强的缺点。翻看了些许抽象工厂模式的讲解,其实各不千秋。在抽象工厂模式里面有产品族这一概念,也说抽象工厂模式是工厂模式的升级,工厂模式里面有产品等级一说。其他见解小菜就不区分详情,在此给出自己的见解、看测试代码。
先看图理解规避侵入性强的特点。
=========================产品接口及其实现类==========================
/*
* 抽象为产品类接口
*/
public interface Sender {
public void send();
}
* 抽象为产品类接口
*/
public interface Sender {
public void send();
}
/**
* 具体产品的实现类(邮寄发送类)
* @author ZJD
*/
public class MailSender implements Sender {
@Override
public void send() {
System.out.println("this is MailSender");
}
}
* 具体产品的实现类(邮寄发送类)
* @author ZJD
*/
public class MailSender implements Sender {
@Override
public void send() {
System.out.println("this is MailSender");
}
}
/**
* 具体产品的实现类(短信类)
* @author ZJD
*/
public class SmsSender implements Sender {
@Override
public void send() {
System.out.println("this is SmsSender");
}
}
* 具体产品的实现类(短信类)
* @author ZJD
*/
public class SmsSender implements Sender {
@Override
public void send() {
System.out.println("this is SmsSender");
}
}
========================工厂接口及其实现(生成)类=======================
/**
* 工厂类生产接口
* @author ZJD
*/
public interface Provider {
// >>>>生成产品方法
public Sender produce();
}
* 工厂类生产接口
* @author ZJD
*/
public interface Provider {
// >>>>生成产品方法
public Sender produce();
}
/**
* 邮件工厂实现类
* @author ZJD
*/
public class SendMailFactory implements Provider {
@Override
public Sender produce() {
return new MailSender();
}
}
* 邮件工厂实现类
* @author ZJD
*/
public class SendMailFactory implements Provider {
@Override
public Sender produce() {
return new MailSender();
}
}
/**
* 短信工厂实现类
* @author ZJD
*/
public class SendSmsFactory implements Provider {
@Override
public Sender produce() {
return new SmsSender();
}
}
* 短信工厂实现类
* @author ZJD
*/
public class SendSmsFactory implements Provider {
@Override
public Sender produce() {
return new SmsSender();
}
}
===================测试类========================
public class AbstractFactoryTest {
public static void main(String[] args) {
//邮件工厂实现类 -->>>>生产发送邮件类的产品
Provider provider1 = new SendMailFactory();
Sender sender1=provider1.produce();
sender1.send();
System.out.println("==========================");
//短信工厂实现类-->>>>生成发送短信的产品
Provider provider2 = new SendSmsFactory();
Sender sender2=provider2.produce();
sender2.send();
}
}
public static void main(String[] args) {
//邮件工厂实现类 -->>>>生产发送邮件类的产品
Provider provider1 = new SendMailFactory();
Sender sender1=provider1.produce();
sender1.send();
System.out.println("==========================");
//短信工厂实现类-->>>>生成发送短信的产品
Provider provider2 = new SendSmsFactory();
Sender sender2=provider2.produce();
sender2.send();
}
}
输出结果:
this is MailSender
==========================
this is SmsSender
==========================
this is SmsSender
如果你现在想增加一个功能:发及时信息,则只需做一个实现类,实现Sender接口,同时做一个工厂类,实现Provider接口,就OK了,无需去改动现成的代码。这样做,拓展性较好
!抽象工厂模式的出现就很好的规避了侵入性的缺点,但抽象工厂和工厂模式的应用也应根据不同的业务场景需求,无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。在系统中我们所做的模块化,抽象化,配置化,为的就是系统的解耦合,一旦能做到满足自身系统和业务需求的解耦合最大化就是对自身最好的设计模式。