一、普通工厂模式
建立一个工厂类,对实现了同一接口的一些类进行实例的创建
实例代码:
发送短信和邮件的例子,首先创建接口:
public interface Sender { public void send(); }
分别完成实现类:
短信发送实现类:
public class SmsSender implements Sender{ @Override
public void send() { System.out.println("发送sms消息"); } }
邮件发送实现类:
public class MailSender implements Sender{ @Override
public void send() { System.out.println("发送email消息"); } }
工厂类:
public class OrdinarySenderFactory { public Sender createSender(String type){ if("sms".equals(type)){
return new SmsSender();
}else if("mail".equals(type)){
return new MailSender();
}else{
System.out.println("请输入正确的类型");
return null;
} }
}
测试类:
public class TestFactory { public static void main(String[] args) {
OrdinarySenderFactory senderFactory=new OrdinarySenderFactory();
Sender sender=senderFactory.createSender("sms");
sender.send();
}
}
运行输出:发送sms消息
在上述的工厂方法中,如果出现传递的字符串参数出现错误,则不能正确的创建对象,所以衍生出新的创建方式——多个工厂方法模式
工厂类如下:
public class OrdinarySenderFactory { public Sender cresteSmsSender(){
return new SmsSender();
} public Sender createmailSender(){
return new MailSender();
} }
二、静态工厂方法模式
将上述的多个工厂方法模式里的方法修改成静态方法,这样就不需要单独创建工厂类实例,直接可调用,工厂类如下:
public class OrdinarySenderFactory { public static Sender cresteSmsSender(){
return new SmsSender();
} public static Sender createmailSender(){
return new MailSender();
} }
测试类:
public class TestFactory { public static void main(String[] args) {
Sender sender1=OrdinarySenderFactory.createmailSender();
sender1.send();
}
}
总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。
三、抽象工厂模式(abstract factory)
考虑一个问题,如果在上述多个工厂方法模式的基础上,需要再加一个发送站内信的功能 messageSender ,那么就需要修改工厂类,在类中增加一个创建messageSender实例的方法。虽然这是可行的,但是这违背了闭包原则(对拓展开放,对修改关闭)。所以,这里就需要用到抽象工厂了,创建一个抽象工厂,所有的工厂都实现这个工厂的对象实例创建方法,这样在要加入新的功能,只需要加入新的工厂类就可以了,不需要修改原来的代码。
发送短信和邮件的例子,首先创建接口:
public interface Sender { public void send(); }
分别完成实现类:
短信发送实现类:
public class SmsSender implements Sender{ @Override
public void send() { System.out.println("发送sms消息"); } }
邮件发送实现类:
public class MailSender implements Sender{ @Override
public void send() { System.out.println("发送email消息");
}
}
抽象工厂类:
public interface SendProvider { public Sender createSender(); }
实现了抽象工厂类的2个具体实现类:
public class SmsSenderFactory implements SendProvider { @Override
public Sender createSender() {
return new SmsSender();
} }
public class MailSenderFactory implements SendProvider{ @Override
public Sender createSender() {
return new MailSender();
} }
测试代码:
public class TestFactory { public static void main(String[] args) {
SendProvider provider=new SmsSenderFactory();
Sender sender=provider.createSender();
sender.send();
}
}
这样如果需要加入messageSender。只需要额外加入实现了Sender接口的MessageSender实现类和实现了SenderProvider抽象工厂的工程类就可以了。
本文参照资料:http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html