简单工厂模式
为什么要使用简单工厂模式:
如果像书上所写用:Api api=new Impl();客户端就知道了接口和实现的类。想想接口的思想是隔离封装。客户端不能知道Impl这个类的。但是这又会造成只知接口而不知其实现的问题。所以诞生了简单工厂。
简单工厂的定义:提供一个创建实例的功能,而无须其内部实现
上代码
可能有的朋友会觉得只是把一个new impl()移到了工厂内部。但是我只能这个问题理解的重点是理解简单工厂的位置
这幅图很好的展示了简单工厂的原理。在客户端只知道接口和工厂类。但是并不知道被包围在虚线框内的实现类。这样就实现了客户不知道实现但是能创建接口实例了
简单工厂的认识:
1.用来造东西的,造接口,抽象类,实例都可以啦
2.不用创建简单工厂的实例,内部的方法都是静态的。还有将构造方法设为私有,防止客户乱造工厂
3.简单工厂什么都能造,但是最好不要把所有的创建工作都交给一个工厂做。有点像大杂烩,一般以一个模块为主。
简单工厂命名建议:
1.类名建议:模块+Factory。如UserFactory
2.方法名:“get+接口名称”或“create+接口名称”如getUser()或createUser();
但是用以上方法。必须传入一个参数。用户必须知道参数的意思,所以还是一定暴露了实现
如果想要添加一种新的实现而不修改代码。可用可配置工厂模式。用xml文件来创建类
可配置的工厂:
package factorymodel; import java.io.IOException; import java.io.InputStream; import java.util.Properties; class MessageAImpl implements MessageA { @Override public void messagePrint() { System.out.println("A"); } } class MessageBImpl implements MessageB { @Override public void messagePrintB() { System.out.println("B"); } } public class FactorySettle { public static MessageA createMessageA() { Properties properties = new Properties(); InputStream in = null; //取得java.properties的资源 try { in = FactorySettle.class.getResourceAsStream("/java.properties"); properties.load(in); } catch (IOException e) { e.printStackTrace(); } finally { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } MessageA messageA = null; try { messageA = (MessageA) Class.forName(properties.getProperty("javaclass")).newInstance(); System.out.println("messagea"); return messageA; } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } System.out.println("create messageA fail"); return null; } public static void main(String[] args) { MessageA messageA=FactorySettle.createMessageA(); messageA.messagePrint(); } }
这样就不用修改源代码,直接改配置文件就好了。