java设计模式-工厂方法模式

java设计模式-工厂方法模式,第1张

java设计模式-工厂方法模式 JAVA 设计模式工厂方法模式(Factory Method)

工厂模式( factory model)
1.普通的工厂模式,就是创建一个普通的工厂类,根据相应的参数建造相应的对象

首先,创建二者的共同接口:

public interface Sender {
    
    public void send();
}

创建实现类
邮件的实现类


public class MailSender implements Sender {

    @Override
    public void send() {
        System.err.println("发送邮件");
    }
}

短信的 实现类


public class SmsSender implements Sender{
    @Override
    public void send() {
        System.err.println("发送短信");
    }
}

工厂类


public enum SendTypeEnum {
    MAIL("mail"),
    SMS("sms");

    private String type;

    SendTypeEnum(String type) {
        this.type = type;
    }
}




public class SendFactory {
    
    public Sender produce(SendTypeEnum sendTypeEnum) {
        switch (sendTypeEnum) {
            case MAIL:
                return new MailSender();
            case SMS:
                return new SmsSender();
            default:
                System.err.println("类型错误");
                return null;
        }
    }
}

测试


public class FactoryTest {
    public static void main(String[] args) {
        SendFactory factory=new SendFactory();
        Sender sender = factory.produce(SendTypeEnum.MAIL);
        sender.send();
    }
}

2.多个工厂方法模式,上面的方法中如果传错了就创建不了对象,这个模式是对普通工厂模式的改进。


public class SendFactory1 {
    
    public Sender produceMail() {
        return new MailSender();
    }

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

3.静态工厂方法模式,就是把工厂的创建对象的方法静态修饰,这样在创建对象的时候不需要创建工厂对象直接调用即可。


public class SendFactory2 {
    
    public static Sender produceMail() {
        return new MailSender();
    }

    
    public static Sender produceSms() {
        return new SmsSender();
    }
}

总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种静态工厂方法模式。

4.抽象工厂模式(Abstract Factory)
不管是普通的工厂模式还是多个工厂方法的工厂模式,都有一个局限性,那就是想新增工厂对象都要修改工厂里面的方法,这就违背了工厂设计原则的开闭原则。所以又提出了抽象工厂模式。这个抽象工厂只提供抽象建造方法,具体创建对象有具体的工厂类实现。
上图:

功能接口

public interface Sender {
    
    public void send();
}

发送邮件类


public class MailSender implements Sender {

    @Override
    public void send() {
        System.err.println("发送邮件");
    }
}

发送短信类


public class SmsSender implements Sender{
    @Override
    public void send() {
        System.err.println("发送短信");
    }
}

抽象工厂

public interface Factory {
    
    public Sender create();
}

发送短信工厂


public class SmsFactory implements Factory{
    @Override
    public Sender create() {
        return new SmsSender();
    }
}

邮件工厂


public class MailFactory implements  Factory{
    @Override
    public Sender create() {
        return new MailSender();
    }
}

测试类


public class FactoryTest1 {
    public static void main(String[] args) {
        Factory smsFactory = new SmsFactory();
        // 发送短信
        Sender smsSender = smsFactory.create();
        smsSender.send();
        // 发送邮件
        Factory mailFactory = new MailFactory();
        Sender mailSender = mailFactory.create();
        mailSender.send();
    }
}

这样可以在不修改源码的基础上灵活的新增工厂类了,体现了开闭原则的思想
示例代码地址

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5695554.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存