在学校实训的时候,第一节课老师就讲的spring中的工厂模式,创建对象的时候,只需要传入配置文件中预设的名字就可以得到该对象,当时确实很困惑.
1. 工厂模式简介
工厂模式用于对象的创建,使得客户从具体的产品对象中被解耦。
2 工厂模式分类
工厂模式获取对象的方式有三种:
- 通过判断变量名获取,每次都要传入字符串变量,用来告诉工厂你要获取的是哪个对象,容易出错.(简单工厂)
- 通过调用工厂中的方法获取.(工厂方法模式)
- 通过调用接口获取.(抽象工厂)
3. 工厂模式实例
模拟背景:用户可以通过短信和发邮件的形式同另外的用户进行交互.
用户可以通过特定的工厂来获取自己想要的交互方式.
1)简单工厂
发送接口
public interface Sender {
public void sendInfo();
}
两个实现类
public class MailSender implements Sender {
@Override
public void sendInfo() {
System.out.println("this is mail content!");
}
}
public class SmsSender implements Sender {
@Override
public void sendInfo() {
System.out.println("this is sms content!");
}
}
简单工厂
public class FactoryByVar {
public Sender sendInfo(String type){
//返回mail类
if(type.equals("mail")){
return new MailSender();
}
//返回sms类
if(type.equals("sms")){
return new SmsSender();
}
System.out.println("请输入正确的类型!");
return null;
}
}
测试代码
public class LastRun {
public static void main(String[] args) {
FactoryByVar factoryByVar = new FactoryByVar();
//通过传入提前配置好的特定对象标识
Sender sender = factoryByVar.sendInfo("mail");
sender.sendInfo();
}
}
运行结果:
this is mail content!
2.工厂方法模式
工厂方法模式与简单工厂模式的区别就在于获取对象的方法不同
工厂方法类
public class FactoryByMethod {
public Sender mailSend(){
return new MailSender();
}
public Sender smsSend(){
return new SmsSender();
}
}
测试代码:
public class LastRun {
public static void main(String[] args) {
FactoryByMethod factoryByMethod = new FactoryByMethod();
Sender sender1 = factoryByMethod.smsSend();
sender1.sendInfo();
}
}
运行结果:
this is sms content!
3.抽象工厂
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
发送接口
public interface Sender {
public void sendInfo();
}
两个实现类
public class MailSender implements Sender {
@Override
public void sendInfo() {
System.out.println("this is mail content!");
}
}
public class SmsSender implements Sender {
@Override
public void sendInfo() {
System.out.println("this is sms content!");
}
}
两个工厂类
public class SmsFactory implements Provider {
@Override
public Sender produce() {
return new SmsSender();
}
}
public class MailFactory implements Provider {
@Override
public Sender produce() {
return new MailSender();
}
}
工厂接口
public interface Provider {
public Sender produce();
}
测试代码
public class LastRun {
public static void main(String[] args) {
//抽象工厂
Provider provider = new MailFactory();
Sender sender2 = provider.produce();
sender2.sendInfo();
}
}
运行结果:
this is mail content!
总结
简单工厂:不能算是真正意义上的设计模式,但可以将客户程序从具体类解耦。
工厂方法:使用继承,把对象的创建委托给子类,由子类来实现创建方法,可以看作是抽象工厂模式中只有单一产品的情况。
抽象工厂:使对象的创建被实现在工厂接口所暴露出来的方法中。
工厂模式可以帮助我们针对抽象/接口编程,而不是针对具体类编程,在不同的场景下按具体情况来使用。