1.工厂模式基本介绍
工厂模式概念:
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
工厂模式,主要实现了创建者和调用者的分离。
分类:1、简单工厂模式;2、工厂方法模式;3、抽象工厂模式。
核心:实例化对象时,用工厂方法代替new操作。
2.简单工厂模式
工厂类作为类使用,产品类作为接口使用,具体产品实现接口,用来生产同一等级结构中的任意产品,当新增产品时,需要修改已有的代码。
/**
* 产品类接口
*/
public interface Sender {
/**
* 发送
*/
void send();
}
/**
* 具体产品实现接口
*/
public class EmailSender implements Sender{
@Override
public void send() {
System.out.println("邮件发送...");
}
}
/**
* 具体产品实现接口
*/
public class WXSender implements Sender{
@Override
public void send() {
System.out.println("微信发送...");
}
}
/**
* 简单工厂模式
* 产品工厂类
* @author merlin
*
*/
public class SimpleMethodFactory {
public Sender produce(String type){
if("email".equals(type)){
return new EmailSender();
}else if("wx".equals(type)){
return new WXSender();
}else{
System.out.println( "请选择正确的发送类型!");
return null;
}
}
}
//简单工厂模式测试
SimpleMethodFactory simpleFactory = new SimpleMethodFactory();
Sender sender = simpleFactory.produce("wx");
sender.send();
测试结果:
微信发送...
3.多个方法工厂模式
是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。
/**
* 多个方法工厂模式
* @author merlin
*
*/
public class MoreMethodFactory {
//email发送
public Sender produceEmail(){
return new EmailSender();
}
//微信发送
public Sender produceWX(){
return new WXSender();
}
}
//多个方法工厂模式测试
MoreMethodFactory moreFactory = new MoreMethodFactory();
Sender produceEmail = moreFactory.produceEmail();
produceEmail.send();
测试结果:
邮件发送...
4.静态工厂方法模式
将多方法工厂方法模式里的方法写成静态的,不需要创建实例,直接调用即可。
/**
* 静态方法工厂模式
* @author merlin
*
*/
public class StaticMethodFactory {
public static Sender produceEmail(){
return new EmailSender();
}
public static Sender produceWX(){
return new WXSender();
}
}
//静态方法工厂模式测试
Sender sender2 = StaticMethodFactory.produceEmail();
sender2.send();
测试结果:
邮件发送...
总结:
当有大量拥有共同接口(属性)的对象时,我们可以通过工厂方法模式进行创建,在以上的三种模式中,第一种如果传入的字符串有误,不能正确吃黄建对象,第三种相对于第二种,不需要实例化工厂对象,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。
5.抽象工厂模式
5.1 介绍
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
保留上述发送接口,以及邮件发送和微信发送实例不变,创建其工厂的抽象接口:
/**
* 工厂抽象接口
*/
public interface Provider {
public Sender produce();
}
/**
* 发送邮件工厂类
* @author merlin
*
*/
public class SendEmailFactory implements Provider{
@Override
public Sender produce() {
return new EmailSender();
}
}
/**
* 发送微信工厂类
* @author merlin
*
*/
public class SendWXFactory implements Provider{
@Override
public Sender produce() {
return new WXSender();
}
}
测试:
/**
* 抽象工厂模式测试类
* 工厂方法模式有一个问题,就是类的创建以来工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,就一定有问题
* 这时候用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码.
* @author melrin
*
*/
public class AbstractFactoryTest {
public static void main(String[] args) {
Provider provider = new SendWXFactory();
Sender sender = provider.produce();
sender.send();
}
}
6.区别
工厂方法模式与抽象工厂模式最大的区别在于,在工厂方法模式中,工厂创造的是一个产品(就是代码中的工厂类),而在抽象工厂模式中,工厂创造的是一个产品族就是代码中的工厂的接口