工厂设计模式来啦
文章内容输出来源:拉勾教育Java就业集训营;
一、概念
工厂模式,是一种创建对象的模式,这种模式将创建对象的责任转移到工厂类;
工厂类,会对实现了同一接口的不同实现类进行实例的创建。
二、分类
工厂设计模式主要分为:普通工厂模式、多个工厂方法模式、静态工厂方法模式、抽象工厂模式。
四、普通工厂模式
1、类图
2、代码实现
Sender.java
public interface Sender { // 自定义抽象方法来描述发送的行为 void send(); }
MailSender.java
public class MailSender implements Sender { @Override public void send() { System.out.println("正在发送邮件..."); } }
SmsSender.java
public class SmsSender implements Sender { @Override public void send() { System.out.println("正在发送短信..."); } }
SendFactory.java
public class SendFactory { // 自定义成员方法实现对象的创建 public Sender produce(String type) { //System.out.println("随便加一句打印进行测试"); if ("mail".equals(type)) { return new MailSender(); } if ("sms".equals(type)) { return new SmsSender(); } return null; } }
SendFactoryTest.java
public class SendFactoryTest { public static void main(String[] args) { // 缺点:代码复杂,可读性略差 // 优点:扩展性和可维护性更强! 尤其是在创建大量对象的前提下 // 1.声明工厂类类型的引用指向工厂类类型的对象 SendFactory sf = new SendFactory(); // 2.调用生产方法来实现对象的创建 Sender sender = sf.produce("mail"); //Sender sender = sf.produce("maill"); //多传了l,错误// 3.使用对象调用方法模拟发生的行为 sender.send(); } }
3、主要缺点
在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,并且可能出现空指针异常
五、多个工厂方法模式
1、类图

2、代码实现
SendFactory.java
public class SendFactory { public Sender produceMail() { return new MailSender(); } public Sender produceSms() { return new SmsSender(); } }
SendFactoryTest.java
public class SendFactoryTest { public static void main(String[] args) { // 1.声明工厂类类型的引用指向工厂类类型的对象 SendFactory sf = new SendFactory(); // 2.调用生产方法来实现对象的创建 Sender sender = sf.produceMail(); // 3.使用对象调用方法模拟发生的行为 sender.send(); } }
3、主要缺点
在多个工厂方法模式中,为了能够正确创建对象,先需要创建工厂类的对象才能调用工厂类中的生产方法。
六、静态工厂方法模式
1、类图

2、代码实现
SendFactory.java
public class SendFactory { public static Sender produceMail() { return new MailSender(); } public static Sender produceSms() { return new SmsSender(); } }
SendFactoryTest.java
public class SendFactoryTest { public static void main(String[] args) { // 1.调用生产方法来实现对象的创建 Sender sender = SendFactory.produceMail(); // 2.使用对象调用方法模拟发生的行为 sender.send(); } }
3、实际意义
工厂方法模式适合:凡是出现了大量的产品需要创建且具有共同的接口时,可以通过工厂方法模式进行创建
4、主要缺点
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序生产新的产品,就必须对工厂类的代码进行修改,这就违背了开闭原则。
七、抽象工厂模式
1、类图

2、代码实现
Provider.java
public interface Provider { // 自定义抽象方法描述产品的生产行为 Sender produce(); }
MailSendFactory.java
public class MailSendFactory implements Provider { @Override public Sender produce() { return new MailSender(); } }
SmsSendFactory.java
public class SmsSendFactory implements Provider { @Override public Sender produce() { return new SmsSender(); } }
SendFactoryTest.java
public class SendFactoryTest { public static void main(String[] args) { System.out.println("-------------------------------------"); Provider provider = new MailSendFactory(); Sender sender2 = provider.produce(); sender2.send(); } }
3、抽象工厂模式的扩展优势

PacketSender.java
public class PacketSender implements Sender { @Override public void send() { System.out.println("正在发送包裹..."); } }
PacketSendFactory.java
public class PacketSendFactory implements Provider { @Override public Sender produce() { return new PacketSender(); } }
SendFactoryTest.java
public class SendFactoryTest { public static void main(String[] args) { System.out.println("-------------------------------------"); Provider provider = new MailSendFactory(); Sender sender2 = provider.produce(); sender2.send(); System.out.println("-------------------------------------"); Provider provider1 = new PacketSendFactory(); Sender sender3 = provider1.produce(); sender3.send(); } }

浙公网安备 33010602011771号