1. 定义
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
2. 角色
2.1 Factory:工厂角色
工厂角色负责实现创建所有实例的内部逻辑。
2.2 Product:抽象产品角色
抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口
2.3 ConcreteProduct:具体产品角色
具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。
3. 实例
创建一个工厂类,来实现发短信以及发邮件。要发邮件或者发短信的时候,直接调用工厂类,告诉工厂类要做的具体事情,工厂类就能去执行。
抽象产品:
package zzw.cn.factory.simple;
public interface ISender
{
public void send();
}
具体产品类:
发邮件:
package zzw.cn.factory.simple;
public class MailSender implements ISender
{
@Override
public void send()
{
System.out.println("This is mail");
}
}
发短信:
package zzw.cn.factory.simple;
public class SmsSender implements ISender
{
@Override
public void send()
{
System.out.println("This is Sms");
}
}
工厂类:
package zzw.cn.factory.simple;
public class SendFactory
{
public ISender produce(String type)
{
if ("mail".equals(type))
{
return new MailSender();
} else if (type.equals("sms"))
{
return new SmsSender();
} else
{
return null;
}
}
}
测试类:
package zzw.cn.factory.simple;
public class TestSimpleFactory
{
public static void main(String[] args)
{
SendFactory factory = new SendFactory();
ISender mail=factory.produce("mail");
ISender sms = factory.produce("sms");
mail.send();
sms.send();
}
}
结果:
This is mail
This is Sms
Process finished with exit code 0
从以上的代码可以看出,新增一个产品,就需要创建一个具体产品类,这个产品类要实现抽象产品类。然后,需要在工厂类新增新产品的生产。
4. 优缺点
优点:
通过使用工厂类,外界不再需要知道如何创造各种具体的产品,只要提供一个产品的名称作为参数传给工厂,就可以直接得到一个想要的产品对象,并且可以按照接口规范来调用产品对象的所有方法。
缺点:
在工厂类中,如果产品多了就会有非常多的if else的判断。如果要新增一个新的产品,就要同时添加一个新产品类,并且修改工厂类,继续新加 else if。当产品不断增多的时候,就要不断的修改工厂类,不利于系统的维护和扩展。