Java设计模式之-工厂方法模式
工厂方法模式分为三种:普通工厂模式、多个工厂方法模式、静态工厂方法模式。
1、普通工厂模式:以发邮件和短信的例子说明。
结构如下图所示
主要分为四个步骤:创建各实例的共同接口、创建各功能实例、创建工厂、主程序。请看如下示例代码
public class FactoryMethodModel {
public static void main(String[] args) {
String type="mail";
SendFactory factory=new SendFactory();
Sender sender=factory.produce(type);
sender.send();
}
}
// 创建二者的共同接口
interface Sender
{
void send();
}
// 创建实现类 MailSender
class MailSender implements Sender {
@Override
public void send() {
System.out.println("this is Mailsender!");
}
}
//创建实现类 SmsSender
class SmsSender implements Sender{
public void send(){
System.out.println("this is SmsSender");
}
}
// 创建工厂类
class SendFactory{
public Sender produce(String type){
if("mail".equals(type)){
return new MailSender();
}
else if("sms".equals(type)){
return new SmsSender();
}else {
System.out.println("请输入正确的类型!");
return null;
}
}
}
输出:this is Mailsender!
2、多个工厂方法模式:
是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。关系图:
将上面的代码修改如下:
public class FactoryMethodModel {
public static void main(String[] args) {
SendFactory factory=new SendFactory();
Sender sender1=factory.produceMailSender();
Sender sender2=factory.produceSmsSender();
sender1.send();
sender2.send();
}
}
// 创建二者的共同接口
interface Sender
{
void send();
}
// 创建实现类 MailSender
class MailSender implements Sender {
@Override
public void send() {
System.out.println("this is Mailsender!");
}
}
//创建实现类 SmsSender
class SmsSender implements Sender{
public void send(){
System.out.println("this is SmsSender");
}
}
// 创建工厂类,有多个工厂方法,分别用来创建不同的对象
class SendFactory{
public Sender produceMailSender(){
return new MailSender();
}
public Sender produceSmsSender(){
return new SmsSender();
}
}
输出结果: this is Mailsender!
this is SmsSender
3、静态工厂方法模式:
将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。
public class FactoryMethodModel {
public static void main(String[] args) {
Sender sender1=SendFactory.produceMailSender();
Sender sender2=SendFactory.produceSmsSender();
sender1.send();
sender2.send();
}
}
// 创建二者的共同接口
interface Sender
{
void send();
}
// 创建实现类 MailSender
class MailSender implements Sender {
@Override
public void send() {
System.out.println("this is Mailsender!");
}
}
//创建实现类 SmsSender
class SmsSender implements Sender{
public void send(){
System.out.println("this is SmsSender");
}
}
// 创建工厂类,有多个工厂方法,分别用来创建不同的对象
class SendFactory{
public static Sender produceMailSender(){
return new MailSender();
}
public static Sender produceSmsSender(){
return new SmsSender();
}
}
输出结果: this is Mailsender!
this is SmsSender
总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。