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