2普通工厂方法模式
就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。
2.1创建接口
1 /**
2 * 发送接口
3 * Created by mrf on 2016/2/25.
4 */
5 public interface Sender {
6 public String send();
7 }
2.2创建两个实现
1 /**
2 * 邮件发送
3 * Created by mrf on 2016/2/25.
4 */
5 public class MailSender implements Sender {
6 @Override
7 public String send() {
8 System.out.println("This is emailSender!");
return "email"; 9 }
10 }
11
12 /**
13 * 短信发送
14 * Created by mrf on 2016/2/25.
15 */
16 public class SmsSender implements Sender {
17 @Override
18 public String send() {
19 System.out.println("This is SmsSender!!");return "sms";
20 }
21 }
2.3创建工厂
1 /**
2 * 发送工厂
3 * Created by mrf on 2016/2/25.
4 */
5 public class SendFactory {
6
7 public Sender produce(String type){
8 if("email".equals(type)){
9 return new MailSender();
10 }
11 if ("sms".equals(type)){
12 return new SmsSender();
13 }
14 System.out.println("输入类型不正确!");
15 return null;
16 }
17 }
2.4使用测试
/** * Created by mrf on 2016/2/25 */
public class SendFactoryTest {
protected long startTime;
protected long endTime;
@Before
public void setUp() throws Exception {
this.startTime= System.currentTimeMillis();
System.out.println("=========开始测试===========");
}
@After
public void tearDown() throws Exception {
this.endTime = System.currentTimeMillis();
System.out.println("测试用时:"+(endTime-startTime));
System.out.println("=========测试结束===========");
}
@Test
public void testProduce() throws Exception {
SendFactory sendFactory = new SendFactory();
Sender sender = sendFactory.produce("email");
String send = sender.send();
assertEquals("email",send);
} }
2.5多个工厂方法模式
package com.test.java.designPattern.factory;
/**
* 多个工厂模式
* <p>
* 是对普通工厂方法模式的改进。因为普通方法模式中key错误则不能正确创建对象,
* 多个工厂模式提供多个创建方法。
* </p>
* Created by mrf on 2016/2/26.
*/
public class MultiSendFacoty {
public Sender produceMail(){
return new MailSender();
}
public Sender produceSms(){
return new SmsSender();
}
}
测试:
package com.test.java.designPattern.factory;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Created by mrf on 2016/2/26.
*/
public class MultiSendFacotyTest {
private MultiSendFacoty facoty;
@Before
public void setUp(){
facoty = new MultiSendFacoty();
}
@Test
public void testProduceMail() throws Exception {
Sender sender = facoty.produceMail();
sender.send();
}
@Test
public void testProduceSms() throws Exception {
Sender sender = facoty.produceSms();
sender.send();
}
}
2.6静态工厂方法模式
将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。
package com.test.java.designPattern.factory;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Created by mrf on 2016/2/26.
*/
public class StaticSendFacotyTest {
@Test
public void testProduceMail() throws Exception {
Sender sender = StaticSendFacoty.produceMail();
sender.send();
}
@Test
public void testProduceSms() throws Exception {
Sender sender = StaticSendFacoty.produceSms();
sender.send();
}
}
2.7总结:
总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。