工厂方法模式

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

适用场景

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

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

首先需要一个接口:

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();
    }
}
相关推荐
于先生吖16 分钟前
Java框架开发短剧漫剧系统:后台管理与接口开发
java·开发语言
khddvbe32 分钟前
C++并发编程中的死锁避免
开发语言·c++·算法
daidaidaiyu1 小时前
Spring IOC 源码学习 声明式事务的入口点
java·spring
myloveasuka1 小时前
[Java]查找算法&排序算法
java·算法·排序算法
清水白石0081 小时前
Free-Threaded Python 实战指南:机遇、风险与 PoC 验证方案
java·python·算法
wWYy.1 小时前
STL:list
开发语言·c++
TON_G-T1 小时前
day.js和 Moment.js
开发语言·javascript·ecmascript
发际线还在1 小时前
互联网大厂Java三轮面试全流程实战问答与解析
java·数据库·分布式·面试·并发·系统设计·大厂
飞Link2 小时前
具身智能核心架构之 Python 行为树 (py_trees) 深度剖析与实战
开发语言·人工智能·python·架构
_周游2 小时前
Kaptcha—Google验证码工具
java·intellij-idea·jquery