工厂方法模式

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

适用场景

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

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

首先需要一个接口:

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();
    }
}
相关推荐
ps酷教程4 小时前
Jackson 解决没有无参构造函数的反序列化问题
java
NiceCloud喜云4 小时前
Opus 4.8 的 Effort Control 怎么选:Low 到 Max 五档策略
android·java·大数据·前端·c++·python·spring
AI玫瑰助手5 小时前
Python函数:默认参数的定义与注意事项
开发语言·python·信息可视化
油炸自行车5 小时前
Claude Code 错误:API Error: 400 Failed to deserialize the JSON body into the
开发语言·javascript·json·trae·claude code·api error 400
肩上风骋5 小时前
C++14特性
开发语言·c++·c++14特性
_日拱一卒5 小时前
LeetCode:994腐烂的橘子
java·数据结构·算法·leetcode·深度优先
隔窗听雨眠5 小时前
Nginx网关响应慢排查手记
java·服务器·nginx
智慧物业老杨6 小时前
智慧物业合同周期管理系统:从风险预警到智能交接的全流程数智化落地方案
java·人工智能·python
源码宝6 小时前
MES系统源码:Java8 + SpringBoot2.7 + MySQL8 + Redis,后端源码清爽易扩展
java·后端·源码·springboot·mes系统·源码二开·mes源码
JAVA社区7 小时前
Java高级全套教程(十)—— SpringCloudAlibaba超详细实战详解
java·开发语言·spring cloud·面试·职场和发展