定义:定义一个用于建立产品对象的方法,由该工厂类根据传入的参数,动态决定应该建立哪个产品类(这些产品类继承自一个父类或接口)的实例。编程
类型:建立类模式设计模式
public interface SmsService { void sendSms(); } public class MontnetsSmsService implements SmsService { @Override public void sendSms() { System.out.println("经过梦网发送!"); } } public class EtonenetSmsService implements SmsService { @Override public void sendSms() { System.out.println("经过移通发送!"); } } public class SmsServiceFactory { public static SmsService getSmsService(int providerId) { SmsService ss; switch (providerId) { case 0: ss = new MontnetsSmsService(); break; case 1: ss = new EtonenetSmsService(); break; default: ss = new EtonenetSmsService(); } return ss; } public static void main(String[] args) { SmsService ss = SmsServiceFactory.getSmsService(0); //发送短信 ss.sendSms(); } }
定义:定义一个用于建立产品对象的接口,由子类决定实例化哪个类,工厂方法使一个类的实例化延迟到其子类。ide
类型:建立类模式spa
类图:.net
工厂方法模式代码:设计
public interface SmsService { void sendSms(); } //工厂接口 public interface SmsServiceFactory { SmsService getSmsService(int providerId); } public class MontnetsSmsService implements SmsService { @Override public void sendSms() { System.out.println("经过梦网发送!"); } } public class EtonenetSmsService implements SmsService { @Override public void sendSms() { System.out.println("经过移通发送!"); } } /** * 工厂实现类 */ public class SmsServiceFactoryImpl implements SmsServiceFactory{ @Override public SmsService getSmsService(int providerId) { SmsService ss; switch (providerId) { case 0: ss = new MontnetsSmsService(); break; case 1: ss = new EtonenetSmsService(); break; default: ss = new EtonenetSmsService(); } return ss; } public static void main(String[] args) { //向上转型为工程接口 SmsServiceFactory ssf = new SmsServiceFactoryImpl(); SmsService ss = ssf.getSmsService(0); //发送短信 ss.sendSms(); } }
工厂方法模式:code
经过工厂方法模式的类图能够看到,工厂方法模式有四个要素:对象
上文提到的简单工厂模式跟工厂方法模式极为类似,区别是:简单工厂只有三个要素,他没有工厂接口,而且获得产品的方法通常是静态的(红色注释部分)。由于没有工厂接口,因此在工厂实现的扩展性方面稍弱,能够算所工厂方法模式的简化版。blog
定义:为建立一组相关或相互依赖的对象提供一个接口,并且无需指定他们的具体类。继承
类型:建立类模式
类图:
抽象工厂模式代码:
public interface SmsService { void sendMsg(); } public interface NoticeService { void sendMsg(); } public interface MsgServiceFactory { SmsService getSmsService(); SmsService getNoticeService(); } public class MontnetsSmsService implements SmsService { @Override public void sendSms() { System.out.println("经过梦网发送!"); } } public class EtonenetSmsService implements SmsService { @Override public void sendMsg() { System.out.println("经过移通发送!"); } } public class ApnsService implements NoticeService { @Override public void sendMsg() { System.out.println("经过APNS发送!"); } } public class JpushService implements NoticeService { @Override public void sendMsg() { System.out.println("经过极光发送!"); } } /** * 抽象工厂实现类1 */ public class MsgServiceFactoryImpl implements MsgServiceFactory{ @Override public SmsService getSmsService() { return new MontnetsSmsService(); } @Override public NoticeService getNoticeService() { return new ApnsService(); } public static void main(String[] args) { //向上转型为工程接口 SmsServiceFactory ssf = new SmsServiceFactoryImpl(); //发送消息经过短信,移通 ssf.getSmsService().sendMsg(); //发送消息经过App,APNS ssf.getNoticeService().sendMsg(); } } /** * 抽象工厂实现类2 */ public class MsgServiceFactoryImpl implements MsgServiceFactory{ @Override public SmsService getSmsService() { return new EtonenetSmsService(); } @Override public NoticeService getNoticeService() { return new JpushService(); } public static void main(String[] args) { //向上转型为工程接口 MsgServiceFactory ssf = new MsgServiceFactoryImpl(); //发送消息经过短信 ssf.getSmsService().sendMsg(); //发送消息经过App ssf.getNoticeService().sendMsg(); } }
抽象工厂模式是工厂方法模式的升级版本,抽象工厂模式除了具备工厂方法模式的优势外,最主要的优势就是能够在类的内部对产品族进行约束。所谓的产品族,通常或多或少的都存在必定的关联,抽象工厂模式就能够在类内部对产品族的关联关系进行定义和描述,而没必要专门引入一个新的类来进行管理。
在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不一样产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。
如上代码中,产品族有短信、App通知。咱们要实现消息的下发,能够经过以下两大产品类达到消息下发的目的。实际开发中的代码好比上编写的更紧凑,会结合简单工厂、工厂方法、抽象工厂、反射等编写。
代码相似以下:
public interface SmsService { void sendMsg(); } public interface NoticeService { void sendMsg(); } public interface MsgServiceFactory { SmsService getSmsService(); SmsService getSmsService(int providerId); SmsService getSmsService(String className); SmsService getNoticeService(); SmsService getNoticeService(int providerId); SmsService getNoticeService(String className); } public class MontnetsSmsService implements SmsService { @Override public void sendSms() { System.out.println("经过梦网发送!"); } } public class EtonenetSmsService implements SmsService { @Override public void sendMsg() { System.out.println("经过移通发送!"); } } public class ApnsService implements NoticeService { @Override public void sendMsg() { System.out.println("经过APNS发送!"); } } public class JpushService implements NoticeService { @Override public void sendMsg() { System.out.println("经过极光发送!"); } } /** * 抽象工厂实现类 */ public class MsgServiceFactoryImpl implements MsgServiceFactory{ @Override public SmsService getSmsService() { return new EtonenetSmsService(); } @Override public SmsService getSmsService(int providerId) { SmsService ss; switch (providerId) { case 0: ss = new MontnetsSmsService(); break; case 1: ss = new EtonenetSmsService(); break; default: ss = new EtonenetSmsService(); } return ss; } @Override public SmsService getSmsService(String className) { //使用反射 Class clazz = Class.forName(className); return (SmsService) clazz.newInstance(); } @Override public SmsService getNoticeService() { return new ApnsService(); } @Override public NoticeService getNoticeService(int providerId) { NoticeService ns; switch (providerId) { case 0: ns = new JpushService(); break; case 1: ns = new ApnsService(); break; default: ns = new ApnsService(); } return ns; } @Override public NoticeService getNoticeService(String className) { //使用反射 Class clazz = Class.forName(className); return (NoticeService) clazz.newInstance(); } public static void main(String[] args) { //向上转型为工程接口 SmsServiceFactory ssf = new SmsServiceFactoryImpl(); //发送消息经过短信,移通 ssf.getSmsService(0).sendMsg(); //发送消息经过App,APNS ssf.getNoticeService(1).sendMsg(); } }
不管是简单工厂模式,工厂方法模式,仍是抽象工厂模式,他们都属于工厂模式,在形式和特色上也是极为类似的,他们的最终目的都是为了解耦。在使用时,咱们没必要去在乎这个模式到底工厂方法模式仍是抽象工厂模式,由于他们之间的演变经常是使人琢磨不透的。常常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,因为类中的产品构成了不一样等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减小一个方法使的提供的产品再也不构成产品族以后,它就演变成了工厂方法模式。
因此,在使用工厂模式时,只须要关心下降耦合度的目的是否达到了,不须要彻底遵照各类模式的特色和约束来实现业务代码。
如写的很差,欢迎拍砖!
PS:
http://blog.csdn.net/zhengzhb/article/details/7359385