工厂方法模式

工厂方法模式是一种创建型设计模式,它提供了一种将对象实例化的过程延迟到子类的方法。该模式定义了一个用于创建对象的接口,但让子类决定实例化哪一个类。

适用场景

  • 需要将对象的创建逻辑集中管理,避免分散在代码各处。
  • 系统需要支持多种类型的对象创建,且这些对象具有共同的接口或基类。
  • 希望将具体类的实例化过程延迟到运行时决定。

下面举一个发送短信和邮件的例子:

首先需要一个接口:

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();
    }
}
相关推荐
nanxun8862 小时前
记一次诡异的 Docker 容器"串包"故障排查
java
用户1563068103515 小时前
Day01 | Java 基础(Java SE)
java
行者全栈架构师6 小时前
Maven dependency:tree 的 8 个高级用法
java·后端
行者全栈架构师10 小时前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_010 小时前
mac(m5)平台编译openjdk
java
唐青枫1 天前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马1 天前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
用户3721574261351 天前
Java 处理 PDF 图片:提取 PDF 中的图片,并压缩 PDF 图片体积
java
用户3721574261351 天前
Java 打印 Word 文档:从基础打印到高级设置
java
用户3521802454752 天前
当 Prompt 学会"热更新":Spring Boot × Nacos3 AI 实战
java·spring boot·ai编程