本文共 2294 字,大约阅读时间需要 7 分钟。
转载:http://zz563143188.iteye.com/blog/1847029
前面的工厂方法模式虽然清晰,但还是感觉有些繁琐,通常使用的还是抽象工厂模式。
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
/** * 发送接口 * Created by mrf on 2016/2/25. */public interface Sender { public String send();}
/** * 邮件发送 * Created by mrf on 2016/2/25. */public class MailSender implements Sender { @Override public String send() { System.out.println("This is emailSender!"); return "email"; }}/** * 短信发送 * Created by mrf on 2016/2/25. */public class SmsSender implements Sender { @Override public String send() { System.out.println("This is SmsSender!!"); return "sms"; }}
/** * 抽象工厂模式 * 消息发送提供者 * Created by mrf on 2016/2/26. */public interface Provider { public Sender produce();}
/** * Created by mrf on 2016/2/26. */public class MailSendFactory implements Provider { @Override public Sender produce() { return new MailSender(); }}/** * Created by mrf on 2016/2/26. */public class SmsSendFactory implements Provider { @Override public Sender produce() { return new SmsSender(); }}
/** * Created by mrf on 2016/2/26. */public class ProviderTest { private Provider provider; @Test public void testMailProduce() throws Exception { provider = new MailSendFactory(); Sender sender = provider.produce(); assertEquals("email", sender.send()); } @Test public void testSmsProduce() throws Exception { provider = new SmsSendFactory(); Sender sender = provider.produce(); assertEquals("sms", sender.send()); }}
分析:
其实这个模式的好处就是,如果你现在想增加一个功能:发及时信息,则只需做一个实现类,实现Sender接口,同时做一个工厂类,实现Provider接口,就OK了,无需去改动现成的代码。这样做,拓展性较好!
这里主要利用的原则是:上转型对象。就是父类可以调用子类继承或重写的方法。provider接口可以调用实现了这个接口的类的对应的方法,如果实现类定义了其他方法则无法调用。这里涉及java的基础知识。下面再分析下上转型对象。
A为基类(可以为接口),B为子类或实现类。A a;a = new B();a就是上转型对象。