本文章,摘抄自:2018黑马程序最新面试题汇总
工厂模式分为:工厂方法模式和抽象工厂模式。
工厂方法模式分为三种:
普通工厂模式:就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。
多个工厂方法模式:是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。
静态工厂方法模式:将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。
普通工厂模式:
1 public interface ISender { 2 3 public void Send(); 4 }
1 public class MailSender implements ISender { 2 3 @Override 4 public void Send() { 5 System.out.println("this is mail sender"); 6 } 7 8 }
1 public class SmsSender implements ISender { 2 3 @Override 4 public void Send() { 5 System.out.println("this is sms sender"); 6 } 7 8 }
1 public class SendFactoryCommon { 2 public ISender produce(String type) { 3 if ("mail".equals(type)) { 4 return new MailSender(); 5 } else if ("sms".equals(type)) { 6 return new SmsSender(); 7 } else { 8 System.out.println("请输入正确的类型!"); 9 return null; 10 } 11 } 12 }
测试方法:
1 @Test 2 public void testCommon() { 3 SendFactoryCommon factory = new SendFactoryCommon(); 4 ISender sender = factory.produce("mail"); 5 sender.Send(); 6 }
多工厂方法模式:该模式是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。
import cn.silence.face.designmode.factory.common.ISender; import cn.silence.face.designmode.factory.common.MailSender; import cn.silence.face.designmode.factory.common.SmsSender; public class SendFactoryMore { public ISender produceMail() { return new MailSender(); } public ISender produceSms() { return new SmsSender(); } }
测试方法:
1 @Test 2 public void testMore() { 3 SendFactoryMore factory = new SendFactoryMore(); 4 ISender sender = factory.produceMail(); 5 sender.Send(); 6 }
静态工厂方法模式:将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。
1 import cn.silence.face.designmode.factory.common.ISender; 2 import cn.silence.face.designmode.factory.common.MailSender; 3 import cn.silence.face.designmode.factory.common.SmsSender; 4 5 public class SendFactoryDyanmic { 6 public static ISender produceMail() { 7 return new MailSender(); 8 } 9 10 public static ISender produceSms() { 11 return new SmsSender(); 12 } 13 }
测试方法:
1 @Test 2 public void testDyanmic() { 3 ISender sender = SendFactoryDyanmic.produceMail(); 4 sender.Send(); 5 }
抽象工厂模式:工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂
类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
1 import cn.silence.face.designmode.factory.common.ISender; 2 3 public interface IProvider { 4 public ISender produce(); 5 }
1 import cn.silence.face.designmode.factory.common.ISender; 2 import cn.silence.face.designmode.factory.common.MailSender; 3 4 public class SendMailFactory implements IProvider { 5 6 @Override 7 public ISender produce() { 8 return new MailSender(); 9 } 10 11 }
1 import cn.silence.face.designmode.factory.common.ISender; 2 import cn.silence.face.designmode.factory.common.SmsSender; 3 4 public class SendSmsFactory implements IProvider { 5 6 @Override 7 public ISender produce() { 8 return new SmsSender(); 9 } 10 11 }
测试方法:
1 @Test 2 public void testAbs() { 3 IProvider provider = new SendMailFactory(); 4 ISender sender = provider.produce(); 5 sender.Send(); 6 }