工厂方法模式是一种创建型设计模式,它提供了一种将对象实例化的过程延迟到子类的方法。该模式定义了一个用于创建对象的接口,但让子类决定实例化哪一个类。
适用场景
- 需要将对象的创建逻辑集中管理,避免分散在代码各处。
- 系统需要支持多种类型的对象创建,且这些对象具有共同的接口或基类。
- 希望将具体类的实例化过程延迟到运行时决定。
下面举一个发送短信和邮件的例子:
首先需要一个接口:
java
public interface Sender {
void send();
}
重写send方法得到发送邮件和短信的类:
java
public class MailSender implements Sender{
@Override
public void send(){
System.out.println("发送邮件!");
}
}
java
public class SmsSender implements Sender{
@Override
public void send(){
System.out.println("发送短信!");
}
}
1、普通工厂模式:不符合开闭原则
java
public class Factory1 {
//普通工厂模式:不符合开闭原则
public Sender Send(String type){
if(type.equals("sms")){
return new SmsSender();
} else if (type.equals("mail")) {
return new MailSender();
}else {
System.out.println("错误的类型!");
return null;
}
}
}
java
public class FactoryTest1 {
public static void main(String[] args) {
Factory1 factory1 = new Factory1();
Sender sms = factory1.Send("sms");
sms.send();
Sender mail = factory1.Send("mail");
mail.send();
// Sender package1 = factory1.Send("package1");
// package1.send();
}
}
2、多个方法工厂模式
java
public class Factory2 {
//多个方法工厂模式
public Sender produceSms(){
return new SmsSender();
}
public Sender produceMail(){
return new MailSender();
}
}
java
public class FactoryTest2 {
public static void main(String[] args) {
Factory2 factory2 = new Factory2();
Sender produceMail = factory2.produceMail();
produceMail.send();
}
}
3、静态方法工厂模式:最优
核心思想就是不让其他类创建工厂对象
java
public class Factory3 {
//静态方法工厂模式:最优
//将构造函数也私有化
private Factory3(){}
//将工厂设为static静态方法,就是不让其他类创建对象
public static Sender SmsProduct(){
return new SmsSender();
}
public static Sender MailProduct(){
return new MailSender();
}
}