Java设计模式---工厂方法模式(Factory-Method)

时间:2021-02-15 16:21:39

一、普通工厂模式

建立一个工厂类,对实现了同一接口的一些类进行实例的创建

实例代码:

发送短信和邮件的例子,首先创建接口:

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