一、总结
1.工厂模式适合:
凡是需要大量生产产品,并且产品之间有共同的接口时,可以使用工厂模式。
2.优点:
把对象的创建集中在一个地方(工厂),便于维护和管理。
调用者只需要从工厂里获取,并不用管产品怎么生产的。
使用工厂模式更符合 面向接口编程和开闭原则 的java编程思想。
二、工厂模式分类
1.普通工厂模式
2.工厂方法模式
3.抽象工厂模式
三、代码示例
0.共同的代码块
/**
* 发送接口类
*/
public interface SendService {
public void send();
}
/**
* email发送实现类
*/
public class EmailSendImpl implements SendService {
@Override
public void send() {
System.out.println("开始发送邮件信息!");
}
}
/**
* sms短信发送实现类
*/
public class SmsSendImpl implements SendService{
@Override
public void send() {
System.out.println("开始发送短信信息......");
}
}
1.普通工厂模式
/**
* 1. 普通工厂模式: 根据传入的字符串来判断生产哪个产品
*/
public class SendNormalFactory {
public SendService produce(String type){
if("email".equals(type)){
return new EmailSendImpl();
}else if ("sms".equals(type)){
return new SmsSendImpl();
}else {
return null ;
}
}
}
普通工厂如果传入字符串错误,则无法获取正确的产品。
2.工厂方法模式
/**
* 工厂方法模式: 工厂类中有多个生产方法,每个方法生产一种产品。
*/
public class SendMethodFactory {
//生产email
public static SendService emailProduce(){
return new EmailSendImpl();
}
//生产sms
public static SendService smsProduce(){
return new SmsSendImpl();
}
}
工厂方法模式虽然解决了上一个问题,但是在需要新增一种类型的时候,需要修改工厂的代码,不符合设计模式的核心思想:开闭原则。
3.抽象工厂模式
新增抽象工厂类,和各种产品的工厂实现类
/**
* 抽象工厂接口
*/
public interface SendAbstractFactory {
public SendService sendFactory();
}
/**
* SMS 工厂
*/
public class SmsFactory implements SendAbstractFactory {
@Override
public SendService sendFactory() {
return new SmsSendImpl();
}
}
/**
* email 工厂
*/
public class EmailFactory implements SendAbstractFactory {
@Override
public SendService sendFactory() {
return new EmailSendImpl();
}
}
4.测试类
public class FactoryTest {
public static void main(String[] args){
/普通工厂模式测试//
SendNormalFactory normalFac = new SendNormalFactory();
SendService sendService = normalFac.produce("sms");
sendService.send();
///
/工厂方法模式测试/
SendService sendService2 = SendMethodFactory.emailProduce();
sendService2.send();
//
//抽象工厂模式测试/
SendAbstractFactory sendAbstractFactory = new SmsFactory();
SendService sendService3 = sendAbstractFactory.sendFactory();
sendService3.send();
}
}
- 如果需要新增一个类型,则直接新增这个类型的工厂实现类和具体实现类即可,这样做的好处无需修改代码。
上面三种模式最多使用的就是第三种抽象工厂类。扩展性好。