工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个创建对象的接口,但让实现这个接口的类来决定实例化哪一个类。工厂方法模式让类的实例化推迟到子类进行。
工厂方法模式的主要作用包括:
-
封装创建逻辑:将对象的创建逻辑封装在工厂类中,使得客户端不需要知道具体的实现类,只需要知道工厂类即可。
-
提高系统的灵活性:通过工厂方法,可以在不修改已有代码的情况下引入新的类。
-
解耦:将具体的产品类与使用产品类的客户代码分离,使得客户代码依赖于抽象,而不是具体实现。
-
易于扩展:当需要新增产品时,只需要添加一个具体的产品类和一个相应的工厂类,无需修改现有的工厂类。
工厂方法模式通常包含以下几个角色:
- 工厂接口(Factory Interface):定义创建产品对象的接口。
- 具体工厂(Concrete Factory):实现工厂接口,生成具体的产品实例。
- 抽象产品(Abstract Product):定义产品的接口,规定了产品的公共接口。
- 具体产品(Concrete Product):实现抽象产品的接口,是工厂方法模式的创建对象。
工厂方法模式在软件开发中非常常见,比如在创建数据库连接、文件操作、GUI组件等场景中都有应用。通过使用工厂方法模式,可以提高代码的可维护性和可扩展性。
1、普通⼯⼚模式:建⽴⼀个⼯⼚类,对实现了同⼀接⼝的⼀些类进⾏实例的创建;
2、多个⼯⼚⽅法模式:提供多个⼯⼚⽅法,分别创建对象
package com.huawei.od.huawei.pattern;
/**
* @ClassName: FactoryMethodPattern
* @author: zengxianjin
* @Desc: ⼯⼚⽅法模式
* @create: 2024-09-04 15:36
* @version: V1.0
**/
public class FactoryMethodPattern {
public static void main(String[] args) {
NormalFactoryPattern nfp = new NormalFactoryPattern();
System.out.println("普通工厂模式======================开始");
nfp.produce("mail").send("普通⼯⼚模式 mail content");
nfp.produce("sms").send("普通⼯⼚模式 sms content");
System.out.println("多工厂方法模式======================开始");
moreFactoryMethodPattern mfp = new moreFactoryMethodPattern();
mfp.produceMail().send("多工厂方法模式 mail content");
mfp.produceSms().send("多工厂方法模式 sms content");
}
}
//普通⼯⼚模式:建⽴⼀个⼯⼚类,对实现了同⼀接⼝的⼀些类进⾏实例的创建
class NormalFactoryPattern {
public Sender produce(String type) {
if ("mail".equals(type)) {
return new MailSender();
} else if ("sms".equals(type)) {
return new SmsSender();
} else {
System.out.println("请输入正确的类型!");
return null;
}
}
}
//多个⼯⼚⽅法模式:提供多个⼯⼚⽅法,分别创建对象;
class moreFactoryMethodPattern {
public Sender produceMail() {
return new MailSender();
}
public Sender produceSms() {
return new SmsSender();
}
}
//发送邮件实现类
class MailSender implements Sender {
@Override
public void send(String msg) {
System.out.println("mail sender: " + msg);
}
}
//发送短信实现类
class SmsSender implements Sender {
@Override
public void send(String msg) {
System.out.println("sms sender: " + msg);
}
}
//发送消息的接⼝
interface Sender {
//发送消息
void send(String msg);
}