下图为所有设计模式,带标记为重点掌握以及工作中常用到的:

javamail 昵称 乱码 java sendmail_工厂类

工厂模式就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建,将创建对象的过程交给工厂类(我们举一个发送邮件和短信的例子):

模式名称

优点  

缺点

使用场景

简单工厂模式

外界不需要创建对象,只需要消费即可

工违反了高内聚责任分配原则,如果需要添加新的类,则就需要改变工厂类了。

①工厂类负责创建的对象比较少

②客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心

工厂方法模式

 新增产品,不需要改动之前工厂类,只需新增工厂类

实现多个产品接口时,难以处理

 日志记录器

抽象工厂模式

 当一个产品族中的多个对象被设计成一起工作时,

它能保证客户端始终只使用同一个产品族中的对象。

 扩展非常困难

 1、QQ 换皮肤,一整套一起换。

 2、生成不同操作系统的程序

首先定义一个接口类Sender,并创建2个实现类实现Sender接口,代码如下:



public interface Sender {
    void Send();
}

// 邮件发送
public class MailSender implements Sender {
    public void Send() {
        System.out.println("this is MailSender");
    }
}

// 短信发送
public class SmsSender implements Sender {
    public void Send() {
        System.out.println("this is SmsSender");
    }
}



简单工厂模式:创建工厂类ManySendFactory

①普通简单工厂模式:



public class SendFactory {
    // 根据传入类型,去获取对应的实列
    public Sender getSender(String type) {
        if ("mail".equals(type)) {
            return new MailSender();
        } else if ("sms".equals(type)) {
            return new SmsSender();
        }
        return null;
    }
}
//使用方法:
SendFactory factory = new SendFactory(); //创建工厂类
Sender sender = factory.getSender("sms"); // 根据类型获取对应实列
sender.Send();



②多方法简单工厂模式:在普通工厂方法模式中,如果传递的类型出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。



public class ManySendFactory {

    public Sender getMailSender() {

        return new MailSender();
    }

    public  Sender getSmsSender() {

        return new SmsSender();
    }
}

// 测试
ManySendFactory manySendFactory = new ManySendFactory();
Sender mailSender = manySendFactory.getMailSender();
mailSender.Send();



③静态方法简单工厂模式:讲多方法模式中的所有方法改成静态的,方便调用



public class StaticSendFactory {

    public static Sender getMailSender() {

        return new MailSender();
    }

    public static Sender getSmsSender() {

        return new SmsSender();
    }
}
// 测试
Sender smsSender = StaticSendFactory.getSmsSender();
smsSender.Send();



工厂方法模式:新增工厂接口Factory,并创建SenderFactory和SmsFactory实现Factory接口,通过指定factory类型去创建(该模式是抽象工厂模式的一种特列)



// Factory接口
public interface Factory {

    Sender createSender();
}

// SmsFactory实现Fatory
public class SmsFactory implements Factory {

    @Override
    public Sender createSender() {
        return new SmsSender();
    }
}

// EmailFactory实现Fatory
public class EmailFactory implements Factory {

    @Override
    public Sender createSender() {
        return new EmailSender();
    }
}



 测试:根据指定不同工厂获取对应对象



public static void main(String[] args) {
        Factory factory = new SmsFactory();
        factory.createSender().Sender(); // 输出this is SmsSender
        
        Factory factory1 = new EmailFactory();
        factory1.createSender().Sender();// 输出this is EmailSender
    }