Java|Java | Factory
简介:
【Java|Java | Factory】工厂模式同单例模式一样,也是Java中最常用的设计模式之一,属于创建型模式,它提供了一种创建对象的最佳方式。能够根据要求调用者提供的信息为接口指定不同的实现类,降低耦合。
接口及其实现类
package factory;
public interface Sender {
public void send();
}
package factory;
public class SmsSender implements Sender{@Override
public void send() {
System.out.println("用短信发送...");
}
}
package factory;
public class EmailSender implements Sender{@Override
public void send() {
System.out.println("用电子邮箱发送...");
}
}
简单工厂
package factory;
/**
* 普通工厂模式,可以需求生产对象
* 缺点:面对复杂的初始化,会使代码变得巨大
*每添加一个实现类都要修改代码,违反了里氏替换原则
*可能会产生null对象,引发 空指针异常
* @author wqj24
*
*/
public class GeneraSenderFactory {public Sender produceSender(String msg) {// 根据消息,指定具体实现类
if ("email".equals(msg)) {
return new EmailSender();
}if ("sms".equals(msg)) {
return new SmsSender();
} // 没有符合要求的产品
return null;
}
}
上面的缺点就是,每写添加一个实现类就要改工厂类的代码,我们可以通过反射解决这一痛点。
简单工厂(反射)
package factory;
/**
* 简单工厂的优化
* 优点:使用反射,避免了添加子类就要修改工厂对象
*/
public class GeneraSenderFactory01 {public Sender produceSender(Class extends Sender> clazz) {Sender sender = null;
try {
sender = (Sender) clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}return sender;
}
}
如果面对初始化复杂的对象,上面那的代码会变得很长,结构性差,可以为每个子类都写一个工厂方法。
多个工厂方法
package factory;
/**
* 多工厂,每个方法负责生产各自的实例 优点可以应对复杂的初始化
* 优点:不会产生 null 对象
*每个方法负责自己对象的初始化工作,结构清晰。
*/
public class ManySenderFactory {public Sender produceEmail() {return new EmailSender();
}public Sender produceSms() {return new SmsSender();
}
}
也可以将上面的方法改写成静态的,这样就可以不用new对象,直接通过类名调用工厂方法了。
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 事件代理
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 数组常用方法一
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- Java|Java基础——数组
- RxJava|RxJava 在Android项目中的使用(一)
- java之static、static|java之static、static final、final的区别与应用
- Java基础-高级特性-枚举实现状态机