工厂方法模式(Factory Method)

工厂方法模式分为三种:工厂模式、多个工厂方法模式,静态工厂方法模式。

1、工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。关系图如下:

举例:发送邮件和短信

首先,创建二者的共同接口:

public interface Sender {
    public void send();
}

其次,创建实现类:

public class MailSender implements Sender{

    @Override
    public void send() {
        System.out.println("this is mailsender!");
    }

}
public class SmsSender implements Sender{

    @Override
    public void send() {
        System.out.println("this is smssender!");
    }

}

最后,建工厂类:

public class SenderFactory {
    
    public Sender createSender(String type){
        if("mail".equals(type)){
            return new MailSender();
        } else if("sms".equals(type)){
            return new SmsSender();
        } else {
            System.out.println("请输入正确的类型!");
            return null;
        }
    }
    
}

测试:

public class Test {
    
    public static void main(String[] args){
        SenderFactory factory = new SenderFactory();
        Sender sender = factory.createSender("sms");
        sender.send();
    }
}

输出:

this is smssender!

2、多个工厂方法模式,是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。关系图如下:

将上面的代码做下修改,改动下Sender1Factory类就行,如下:

public class Sender1Factory {
    
    public Sender createMailSender(){
        return new MailSender();
    }
    
    public Sender createSmsSender(){
        return new SmsSender();
    }
    
}

测试:

public class Test {
    
    public static void main(String[] args){
        // 普通工厂方法模式
        SenderFactory factory = new SenderFactory();
        Sender sender = factory.createSender("sms");
        sender.send();
        
        // 多个工厂方法模式
        Sender1Factory factory1 = new Sender1Factory();
        Sender sender1 = factory1.createMailSender();
        sender1.send();
        
        
    }
}

输出:

this is smssender!
this is mailsender!

3、静态工厂方法模式,将上面的多个工厂方法模式里的方法设置为静态的,不需要创建实例,直接调用即可。

public class Sender2Factory {
    
    public static Sender createMailSender(){
        return new MailSender();
    }
    
    public static Sender createSmsSender(){
        return new SmsSender();
    }
}

测试:

public class Test {
    
    public static void main(String[] args){
        // 普通工厂方法模式
        SenderFactory factory = new SenderFactory();
        Sender sender = factory.createSender("sms");
        sender.send();
        
        // 多个工厂方法模式
        Sender1Factory factory1 = new Sender1Factory();
        Sender sender1 = factory1.createMailSender();
        sender1.send();
        
        // 静态工厂方法模式
        Sender sender2 = Sender2Factory.createSmsSender();
        sender2.send();
    }
}

输出:

this is smssender!
this is mailsender!
this is smssender!

 

总体来说,工厂模式适合大量产品需要创建的情况。在以上的三种模式中,第一种如果传入参数有误,就不能创建对象,第三种相对于第二种,不需要实例化工厂类。所以,大多数情况下,我们会选用第三种——静态工厂方法模式。

 

改编于,如需看原文请点击:http://blog.csdn.net/zhangerqing/article/details/8194653

posted @ 2015-07-06 18:20  蜉蝣朝生而暮死  阅读(147)  评论(0编辑  收藏  举报