java设计模式之工厂设计模式(Factory)

在学校实训的时候,第一节课老师就讲的spring中的工厂模式,创建对象的时候,只需要传入配置文件中预设的名字就可以得到该对象,当时确实很困惑.

1. 工厂模式简介

工厂模式用于对象的创建,使得客户从具体的产品对象中被解耦。

2 工厂模式分类

工厂模式获取对象的方式有三种:

  1. 通过判断变量名获取,每次都要传入字符串变量,用来告诉工厂你要获取的是哪个对象,容易出错.(简单工厂)
  2. 通过调用工厂中的方法获取.(工厂方法模式)
  3. 通过调用接口获取.(抽象工厂)

3. 工厂模式实例

模拟背景:用户可以通过短信和发邮件的形式同另外的用户进行交互.
用户可以通过特定的工厂来获取自己想要的交互方式.

1)简单工厂
发送接口

public interface Sender {
    public void sendInfo();
}

两个实现类

public class MailSender implements Sender {
    @Override
    public void sendInfo() {
        System.out.println("this is mail content!");
    }
}
public class SmsSender implements Sender {
    @Override
    public void sendInfo() {
        System.out.println("this is sms content!");
    }
}

简单工厂

public class FactoryByVar {
    public Sender sendInfo(String type){
        //返回mail类
        if(type.equals("mail")){
            return new MailSender();
        }
        //返回sms类
        if(type.equals("sms")){
            return new SmsSender();
        }
        System.out.println("请输入正确的类型!");
        return null;
    }
}

测试代码

public class LastRun {
    public static void main(String[] args) {
        FactoryByVar factoryByVar = new FactoryByVar();
        //通过传入提前配置好的特定对象标识
        Sender sender = factoryByVar.sendInfo("mail");
        sender.sendInfo();
    }
}

运行结果:
this is mail content!

2.工厂方法模式

工厂方法模式与简单工厂模式的区别就在于获取对象的方法不同
工厂方法类

public class FactoryByMethod {
    public Sender mailSend(){
        return new MailSender();
    }

    public Sender smsSend(){
        return new SmsSender();
    }

}

测试代码:

public class LastRun {
    public static void main(String[] args) {

        FactoryByMethod factoryByMethod = new FactoryByMethod();
        Sender sender1 = factoryByMethod.smsSend();
        sender1.sendInfo();
    }
}

运行结果:
this is sms content!

3.抽象工厂

提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

发送接口

public interface Sender {
    public void sendInfo();
}

两个实现类

public class MailSender implements Sender {
    @Override
    public void sendInfo() {
        System.out.println("this is mail content!");
    }
}
public class SmsSender implements Sender {
    @Override
    public void sendInfo() {
        System.out.println("this is sms content!");
    }
}

两个工厂类

public class SmsFactory implements Provider {
    @Override
    public Sender produce() {
        return new SmsSender();
    }
}
public class MailFactory implements Provider {
    @Override
    public Sender produce() {
        return new MailSender();
    }
}

工厂接口

public interface Provider {
    public Sender produce();
}

测试代码

public class LastRun {
    public static void main(String[] args) {
        //抽象工厂
        Provider provider = new MailFactory();
        Sender sender2 = provider.produce();
        sender2.sendInfo();
    }
}

运行结果:
this is mail content!

总结

简单工厂:不能算是真正意义上的设计模式,但可以将客户程序从具体类解耦。

工厂方法:使用继承,把对象的创建委托给子类,由子类来实现创建方法,可以看作是抽象工厂模式中只有单一产品的情况。

抽象工厂:使对象的创建被实现在工厂接口所暴露出来的方法中。

工厂模式可以帮助我们针对抽象/接口编程,而不是针对具体类编程,在不同的场景下按具体情况来使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值