工厂模式属于设计模式中的建造者模式,它是用一个工厂来封装对象的创建,客户只需要知道所需产品的具体工厂,而无须知道具体工厂的创建产品的过程,甚至不需要知道具体产品的类名。可分为以下三类:
- 简单工厂模式
- 静态工厂模式
- 抽象工厂模式
1.简单工厂模式
- 概述:简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。
- 实现方式:简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
- 缺点:增加功能修改的是工厂类。
代码实现:
功能:创建发送邮件和发送短信的对象,进行发送操作。
- 定义发送操作的接口
public interface Sender {
void send();
}
- 定义具体的类去实现接口发送功能,来发送邮件和短信
public class MailSender implements Sender {
@Override
public void send() {
System.out.println("发送邮件。。。。");
}
}
public class SMSSender implements Sender {
@Override
public void send() {
System.out.println("发送短信。。。。");
}
}
- 创建工厂类,用来实例化对象
public class SenderFactory {
public Sender create(String type){
if("Mail".equals(type)){
return new MailSender();
}else if("SMS".equals(type)){
return new SMSSender();
}
return null;
}
}
- 测试类,进行测试
public class TestSender {
public static void main(String[] args) {
Sender mailSender=new SenderFactory().create("Mail");
Sender sMSSender =new SenderFactory().create("SMS");
mailSender.send();
sMSSender.send();
}
}
2.静态工厂模式
它是在简单工厂模式的基础上,对于SenderFactory类中的create方法加上了static修饰,使得在测试时,可以通过类名直接调用创建方法,一定程度上简化了代码。
public static Sender create(String type){}
测试类做如下修改:
Sender mailSender=SenderFactory.create("Mail");
Sender sMSSender =SenderFactory.create("SMS");
对于简单工厂模式和静态工厂模式:
如果此时我们要再添加一个发送微信的对象,去发送微信,就得进入到SenderFactory工厂里的create方法,再加入一条else if语句,这样就大大违反了设计模式里的开闭原则,对此可以对SenderFactory做以下改进:
public class SenderFactory {
public Sender createMailSender(){
return new MailSender();
}
public Sender createSMSSender(){
return new SMSSender();
}
//添加一个创建发送微信对象的方法
public Sender createWechatSender(){
return new WechatSender();
}
}
}
这样在增加新功能时,我们就只需要在SenderFactory中增加一个方法,而不需要进入方法中去修改代码,一定程度改善了简单工厂模式。但还可以进行优化,这就引入了抽象工厂模式。
3.抽象工厂模式
抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂,每个生成的工厂都能按照超级工厂模式提供对象。
代码实现:
- 定义发送操作的接口、定义具体的类去实现接口发送功能,来发送邮件和短信(同简单工厂模式)
- 创建抽象工厂类,定制一种模板。让其他工厂来继承,从而实例化对应对象
public abstract class SenderFactory {
public abstract Sender createSender();
}
- 定义具体工厂,来创建某个具体对象的创建。
public class MailFactory extends SenderFactory {
@Override
public Sender createSender() {
return new MailSender();
}
}
public class SMSFactory extends SenderFactory{
@Override
public Sender createSender() {
return new SMSSender();
}
}
- 编写测试代码
public class TestSender {
public static void main(String[] args) {
Sender mailSender= new MailFactory().createSender();
Sender sMSSender = new SMSFactory().createSender();
mailSender.send();
sMSSender.send();
}
}