工厂方法模式

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

适用场景

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

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

首先需要一个接口:

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();
    }
}
相关推荐
qfljg2 小时前
OpenRewrite 实战指南
java
Sylvia33.2 小时前
LOL实时数据接入深度解析:从WebSocket到完整数据模型
java·网络·python·websocket·网络协议
2601_962071577 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
zww89491118 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·eclipse
淡海水8 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
CS_Zero9 小时前
C语言sizeof是函数吗?
c语言·开发语言
-今昭-10 小时前
《V2V 迁移实战:将 VMware 虚拟机转为 OpenStack 可用 Glance qcow2 镜像》
开发语言·python
zww894911111 小时前
匿名树洞系统开发实战:从需求分析到部署指南
java·eclipse
黑马程序员毕设12 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
木井巳12 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法