Java设计模式-简单工厂模式/工厂模式/抽象工厂模式

本文深入解析工厂模式、简单工厂模式及抽象工厂模式,通过实例展示如何使用这些模式来提高代码的可维护性和可扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

工厂模式

工厂模式优点

工厂模式应用

工厂模式实例

工厂模式

简单工厂模式

抽象工厂模式

上述代码 GitHub 地址:https://github.com/baicun/designPatterns


工厂模式

创建一个类,对同样操作的方法接口进行封装,类似工厂管理生产线等情形。

工厂模式优点

方便管理,易于拓展。

工厂模式应用

数据库访问,我们只需要更换驱动包就可以。

工厂模式实例

工厂模式

定义了一个创建对象的类,由这个类来封装实例化不同对象,采用if-else判断。

类图:

示例:

公共接口:

//公共接口
public interface Send {
    public void send();
}

实现类: 

//发送短信
public class SmsSend implements Send {
    @Override
    public void send() {
        System.out.println("发送短信成功");
    }
}
//发送邮件
public class MailSend implements Send {
    @Override
    public void send() {
        System.out.println("发送邮件成功");
    }
}

工厂类:

//工厂类
public class SendFactory {

    public Send produce(String type) {

        if ("mail".equals(type)) {
            return new MailSend();
        } else if ("sms".equals(type)) {
            return new SmsSend();
        } else {
            System.out.println("请输入正确的类型!");
            return null;
        }
    }
}

测试:

    // 测试
    public static void main(String[] args) {
        SendFactory factory = new SendFactory();
        Send s = factory.produce(sendType());
        s.send();
    }

    //客户端输入发送类型
    private static String sendType() {
        try {
            BufferedReader write = new BufferedReader(new InputStreamReader(System.in));
            System.out.print("请输入发送类型!:");
            String str = write.readLine();
            return str;
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }

上面的代码就是实现简单工厂模式。每当我们创建一个发送一条信息,首先输入发送类型,然后便可以发送成功,这样人为的错误比较高,随便一个字母输入错误就失败了。接下来看工厂模式。

简单工厂模式

定义了一个创建对象的抽象方法,由子类决定要实例化的类。

类图:

//简单工厂类
public class SimpleFactory {
    //发送邮件
    public Send proceMail(){
        return new MailSend();
    }
    //发送短信
    public Send proceSms(){
        return new SmsSend();
    }
}

测试:

    public static void main(String[] args) {
        SimpleFactory factory = new SimpleFactory();
        Send send = factory.proceMail();
        send.send();
    }

如此实现工厂模式,已经很棒了,但是违反了设计模式原则,对拓展开放,对修改关闭!最后看最优模式。

抽象工厂模式

定义了一个接口用于创建相关或有依赖关系的对象族,而无需明确指定具体类。

个人觉得抽象工厂模式可以理解为是对工厂族的二层封装。请看下面代码,以发送邮件、短信为例。

类图:

共俩个接口,最初接口:

//公共接口
public interface Send {
    public void send();
}

在增加提供一个接口:

//抽象接口
public interface Provider {
    public Send produce(String type);//发送类型
}

接口的实现类

-->  邮件

//QQ邮件实现类
public class SendMailQqImpl implements Send{
    @Override
    public void send() {
        System.out.println("发送QQ邮件");
    }
}
//126邮件实现类
public class SendMail126Impl implements Send{
    @Override
    public void send() {
        System.out.println("发送126邮件");
    }
}

-->  短信 

//短信实现类
public class SendSmsImpl implements Send {
    @Override
    public void send() {
        System.out.println("发送短信,到SC");
    }
}

工厂类;

核心:

//短信工厂类
public class SendSmsFactory implements Provider {

    @Override
    public Send produce(String type) {
        return new SendSmsImpl();
    }
}

 

//邮件工厂类
public class SendMailFactory implements Provider{
    public Send produce(String type){
        //如果 type=qq,则发送qq邮件,否则发送126邮件
        if("qq".equals(type)){
            return new SendMailQqImpl();
        }else{
            return new SendMail126Impl();
        }
    }
}

测试:

    // 测试邮件工厂
    public static void main(String[] args) {
        Provider provider = new SendMailFactory();//实例化工厂
        Send mailsend = provider.produce("qq");//得到实现方法
        mailsend.send();//执行接口方法
    }

以后我们在新增一个功能的话,只要创建一个实现 Send 接口的实现类,以及实现  Provider 的工厂类就可以拓展了。

 

上述代码 GitHub 地址:https://github.com/baicun/designPatterns

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值