一、普通工厂模式
建立一个工厂类,对实现了同一接口的一些类进行实例的创建
实例代码:
发送短信和邮件的例子,首先创建接口:
public interface Sender { public void send(); }分别完成实现类:
短信发送实现类:
public class SmsSender implements Sender{ @Override public void send() { System.out.println("发送sms消息"); } }邮件发送实现类:
public class MailSender implements Sender{ @Override public void send() { System.out.println("发送email消息"); } }
工厂类:
public class OrdinarySenderFactory { public Sender createSender(String type){ if("sms".equals(type)){ return new SmsSender(); }else if("mail".equals(type)){ return new MailSender(); }else{ System.out.println("请输入正确的类型"); return null; } } }测试类:
public class TestFactory { public static void main(String[] args) { OrdinarySenderFactory senderFactory=new OrdinarySenderFactory(); Sender sender=senderFactory.createSender("sms"); sender.send(); } }运行输出:发送sms消息
在上述的工厂方法中,如果出现传递的字符串参数出现错误,则不能正确的创建对象,所以衍生出新的创建方式——多个工厂方法模式
工厂类如下:
public class OrdinarySenderFactory { public Sender cresteSmsSender(){ return new SmsSender(); } public Sender createmailSender(){ return new MailSender(); } }
二、静态工厂方法模式
将上述的多个工厂方法模式里的方法修改成静态方法,这样就不需要单独创建工厂类实例,直接可调用,工厂类如下:
public class OrdinarySenderFactory { public static Sender cresteSmsSender(){ return new SmsSender(); } public static Sender createmailSender(){ return new MailSender(); } }测试类:
public class TestFactory { public static void main(String[] args) { Sender sender1=OrdinarySenderFactory.createmailSender(); sender1.send(); } }总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。
三、抽象工厂模式(abstract factory)
考虑一个问题,如果在上述多个工厂方法模式的基础上,需要再加一个发送站内信的功能 messageSender ,那么就需要修改工厂类,在类中增加一个创建messageSender实例的方法。虽然这是可行的,但是这违背了闭包原则(对拓展开放,对修改关闭)。所以,这里就需要用到抽象工厂了,创建一个抽象工厂,所有的工厂都实现这个工厂的对象实例创建方法,这样在要加入新的功能,只需要加入新的工厂类就可以了,不需要修改原来的代码。
发送短信和邮件的例子,首先创建接口:
public interface Sender { public void send(); }分别完成实现类:
短信发送实现类:
public class SmsSender implements Sender{ @Override public void send() { System.out.println("发送sms消息"); } }邮件发送实现类:
public class MailSender implements Sender{ @Override public void send() { System.out.println("发送email消息"); } }抽象工厂类:
public interface SendProvider { public Sender createSender(); }实现了抽象工厂类的2个具体实现类:
public class SmsSenderFactory implements SendProvider { @Override public Sender createSender() { return new SmsSender(); } }
public class MailSenderFactory implements SendProvider{ @Override public Sender createSender() { return new MailSender(); } }测试代码:
public class TestFactory { public static void main(String[] args) { SendProvider provider=new SmsSenderFactory(); Sender sender=provider.createSender(); sender.send(); } }这样如果需要加入messageSender。只需要额外加入实现了Sender接口的MessageSender实现类和实现了SenderProvider抽象工厂的工程类就可以了。
本文参照资料:http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html