下图为所有设计模式,带标记为重点掌握以及工作中常用到的:
工厂模式就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建,将创建对象的过程交给工厂类(我们举一个发送邮件和短信的例子):
模式名称 | 优点 | 缺点 | 使用场景 |
简单工厂模式 | 外界不需要创建对象,只需要消费即可 | 工违反了高内聚责任分配原则,如果需要添加新的类,则就需要改变工厂类了。 | ①工厂类负责创建的对象比较少 ②客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心 |
工厂方法模式 | 新增产品,不需要改动之前工厂类,只需新增工厂类 | 实现多个产品接口时,难以处理 | 日志记录器 |
抽象工厂模式 | 当一个产品族中的多个对象被设计成一起工作时, 它能保证客户端始终只使用同一个产品族中的对象。 | 扩展非常困难 | 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
}