简单工厂模式就是由一个工厂类根据传入的参量决定创建出哪一种产品类型的实例。
工厂模式的一般性结构如下图:
下面我们拿实例来介绍简单工厂模式。
简单工厂模式分为3种~
第一种:普通~
建立了一个工厂类,对实现了同一接口的一些类进行实例的创建~
首先看下关系图:
举例如下:
我们举一个发送短信和邮件的例子
首先,创建二者的共同接口-Sender:
public interface Sender {
public abstract void Send();
}
其次,创建实现类:
public class MailSender implements Sender{
@Override
public void Send() {
// TODO Auto-generated method stub
System.out.println("this is MailSender");
}
}
public class SmsSender implements Sender{
@Override
public void Send() {
// TODO Auto-generated method stub
System.out.println("this is SmsSender");
}
}
最后,创建工厂类:
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;
}
}
}
我们来测试一下:
public class FactoryTest {
public static void main(String[] args) {
SendFactory sendFactory=new SendFactory();
Sender sender=sendFactory.produce("sms");
sender.Send();
}
}
输出:this is SmsSender
第二种:多个方法~
是对普通工厂模式方法的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确的创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。关系图:
将上面的代码做下修改,改动下Sendfactory,代码如下:
public class SendFactory {
public Sender produceMail(){
return new MailSender();
}
public Sender produceSms(){
return new SmsSender();
}
}
测试类:
public class FactoryTest {
public static void main(String[] args) {
SendFactory factory = new SendFactory();
Sender sender = factory.produceMail();
sender.Send();
}
}
运行结果:
this is MailSender
第三种方式:多个静态方法
将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用而已。
public class SendFactory {
public static Sender produceMail(){
return new MailSender();
}
public static Sender produceSms(){
return new SmsSender();
}
}
测试类:public class FactoryTest {
public static void main(String[] args) {
Sender sender=SendFactory.produceMail();
sender.Send();
}
}
运行效果:
this is MailSender
通过以上分析及其代码列举可知,简单工厂类的构造有三种角色,它们分别是工厂角色,抽象产品角色和具体产品角色。工厂类的创建方法根据传入的参数来判断实例化那个具体的产品实例。
工厂类角色:这个角色是工厂方法模式的核心,含有与应用紧密相连的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体的java类来实现。
抽象产品角色:担当这个角色的是一个java接口或者java抽象类来实现。往往是工厂产生具体类的父类。
具体产品角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品往往就是一个具体的java类来承担。
简单工厂的优缺点:
1、优点是因为客户端可以直接消费产品,而不关心具体产品的实现,免除了客户端直接创建产品对象的责任,简单工厂模式就是通过这种方法实现了对责任的分割。
2、缺点是简单工厂在当产品多层次结构复杂时工厂只能依靠自己,这样就形成了一个万能类,如果这个工厂不能工作了,所有的创建都将不能实现,而且当产品类别多结构复杂的情况下,把所有创建放进一个工厂来,是的后期程序的扩展较为困难。
总体来说:
工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,那就不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选择用第三种-静态工厂方法模式