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

一、普通工厂模式
建立一个工厂类,对实现了同一接口的一些类进行实例的创建
实例代码:
发送短信和邮件的例子,首先创建接口:

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


原文地址:https://www.cnblogs.com/elgin-seth/p/5293774.html