java23种常用设计模式之工厂方法模式(Factory Method)

最近真是所有时间都奉献给工作了,包括下班后,连续加了两个星期的班,都没时间写博客……

(借口!!!中午两个小时够写一篇啦!!!哈哈,我错了,是懒……)

23个设计模式才写了3个,我只想说一声,“”革命尚未成功,同志仍需努力呀!"

好了,胡扯到此结束,回到正题。今天我们来捋一捋工厂方法模式。这个模式很容易理解,如其名,无非就是为了偷懒,对某种事物进行工厂式的批量生产。

工厂方法有三种模式:普通工厂方法模式、多个工厂生产模式和静态工厂方法模式。

下面我们一一来揭开它的真面目。

一、普通工厂方法模式

建立一个工厂类,对实现了同一接口的一些类进行实例的创建,举个例子,发送消息,可以使邮件发送也可以是sms发送,我管他是什么消息,给工厂方法一个类型,我要什么就给我生产什么就好了,看类图:

java23种常用设计模式之工厂方法模式(Factory Method)_第1张图片

首先,创建邮件和sms的共同接口

Sender.java

package com.freedom.factory;

public interface Sender {
	
	public void send();

}
然后,创建邮件发送消息的实现类

MailSender.java

package com.freedom.factory;

public class MailSender implements Sender {

	@Override
	public void send() {
		System.out.println("mail");

	}

}
创建SMS发送消息的实现类

SmsSender.java

package com.freedom.factory;

public class SmsSender implements Sender {

	@Override
	public void send() {
		System.out.println("sms");

	}

}
接着,建立消息生产工厂

SendFactory.java

package com.freedom.factory;

public 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;
		}
			
	}

}
最后,我们test一下,看看这个工厂能不能正确生产

@Test
	public void test() {
		SendFactory sf = new SendFactory();
		Sender send = sf.produce("sms");
		send.send();
	}
	
输出结果:sms

二、多个工厂方法模式

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

java23种常用设计模式之工厂方法模式(Factory Method)_第2张图片

package com.freedom.factory;

public class SendFactory2 {
	//生产邮件消息
	public Sender produceMail(){
		
		return new MailSender();
		
	}
        //生产SMS消息
	public Sender produceSms(){
		
		return new SmsSender();
		
	}

}
test

@Test
	public void test2() {
		SendFactory2 sf = new SendFactory2();
		Sender send = sf.produceMail();
		send.send();
		Sender send2 = sf.produceSms();
		send2.send();
	}
输出结果:mail

                    sms

三、静态生产工厂方法

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

package com.freedom.factory;

public class SendFactory3 {
	
	public static Sender produceMail(){
		
		return new MailSender();
		
	}
	
	public static Sender produceSms(){
		
		return new SmsSender();
		
	}

}
test

@Test
	public void test3() {
		Sender send = SendFactory3.produceMail();
		send.send();
		Sender send2 = SendFactory3.produceSms();
		send2.send();
	}
输出结果同上。

小结:

工厂模式适用范围:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。

在以上的三种模式中,普通工厂方法模式如果传入的字符串有误,不能正确创建对象,静态工厂方法模式相对于多种工厂方法模式,不需要实例化工厂类,所以,大多数情况下,静态工厂方法模式更常用。

缺点:工厂方法模式有一个问题,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。下一篇我们来详细介绍一下抽象工厂模式。


下载源码:http://download.csdn.net/detail/github_22022001/8290541

你可能感兴趣的:(java23种常用设计模式之工厂方法模式(Factory Method))