介绍
这是我给大家介绍的8个面试必问的设计模式的第二类:抽象工厂模式.学完这8类必会的那么面试就不会有什么问题了,其余的无非都是多态的演变.好的开始讲解第二类:
大家可以发现,前面我给大家已经讲过了”工厂模式”,那么现在这篇文章是”抽象工厂模式”,这两个模式的有什么区别呢,下面我就给大家总结出他们的区别和特点
“抽象”工厂方法模式和普通工厂方法的不同:
- 1.”每个具体实例”的背后都有一个工厂类.
- 2.有各个工厂类统一的”接口”
存在的原因:
- 由于普通工厂模式,要”拓展功能”的时候,需要对”工厂类”进行修改
(例子:比如现在又来了个发送彩信的方法,普通方法:必须修改工厂类方法,添加一个方法,并new,不符合开闭原则
解决方法:
- 建造多个工厂类
(例如,短信类创建一个短信工厂类,邮箱也是如此,工厂类都实现同一个接口,为了等下统一执行工厂类的方法,这样以后添加发送XXX的功能,只需要建立这个类和工厂类即可)
代码
/**
* 抽象工厂方法:
* 1.各个类对应有各自的工厂类
* 2.各个工厂类实现同一个接口,因为加了功能类,加了工厂类,接口就一个,等下只要指向不同对象即可.
* 3.最后只需要创建接口的实例即可
* 4.后续添加功能,那么只需(添加一个类+对应的工厂类即可)
*/
//给工厂类的接口
interface Provid {
public Send provid();
}
//发送接口
interface Send {
public void send();
}
//发送短信类,实现发送类
class SendMessage implements Send {
@Override
public void send() {
System.out.println("发送了 短信...");
}
}
//发送邮件类,实现发送类
class SendEmail implements Send {
@Override
public void send() {
System.out.println("发送了 邮件...");
}
}
//发送信息工厂类,实现拓展接口
class SendMessageFactory implements Provid{
@Override
public Send provid() {
//返回对应的类
return new SendMessage();
}
}
//发送邮件工厂类,实现拓展接口
class SendEmailFactory implements Provid{
@Override
public Send provid() {
//返回对应的类
return new SendEmail();
}
}
class Test {
public static void main(String[] args) {
//实现工厂接口的具体实例
Provid semail = new SendEmailFactory();
//实现发送的具体实例
Send smail = semail.provid();
//调用接口存在的方法即可.
smail.send();
}
}
打印结果:
发送了 邮件...