工厂方法模式

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

适用场景

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

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

首先需要一个接口:

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();
    }
}
相关推荐
Elias不吃糖14 小时前
Java Lambda 表达式
java·开发语言·学习
guygg8814 小时前
一级倒立摆MATLAB仿真程序
开发语言·matlab
情缘晓梦.15 小时前
C语言指针进阶
java·开发语言·算法
世转神风-15 小时前
qt-字符串版本与数值版本互转
开发语言·qt
极客代码15 小时前
深入解析C语言中的函数指针:原理、规则与实践
c语言·开发语言·指针·状态机·函数·函数指针
w-w0w-w16 小时前
C++模板参数与特化全解析
开发语言·c++
不绝19116 小时前
C#核心:继承
开发语言·c#
南知意-16 小时前
IDEA 2025.3 版本安装指南(完整图文教程)
java·intellij-idea·开发工具·idea安装
AI即插即用17 小时前
即插即用系列(代码实践)专栏介绍
开发语言·人工智能·深度学习·计算机视觉